处理R中的日期时间值

ZAW*_*AWD 5 time r date data.table

首先,我有一个大的data.table,带有一个参数-Date,但str(Date)是chr.

date                
2015-07-01 0:15:00 
2015-07-01 0:30:00 
2015-07-01 0:45:00 
2015-07-01 0:60:00 
2015-07-01 1:15:00 
2015-07-01 1:30:00 
2015-07-01 1:45:00 
2015-07-01 1:60:00 
Run Code Online (Sandbox Code Playgroud)

我想做的是

  • 以标准格式制作,如:2015-07-01 00:15:00
  • 更正时间,例如:2015-07-01 1:60:00 - > 2015-07-01 02:00:00

对于第一个,我试图使用函数as.POSIXct()来重置格式,它应该是正确的,但问题是对于像2015-07-01 1:60:00这样的数据,转换后,它是只是NA.

有谁有想法?

这是生成测试数据的代码:

dd <- data.table(date = c("2015-07-01 0:15:00", "2015-07-01 0:30:00", 
    "2015-07-01 0:45:00","2015-07-01 0:60:00", "2015-07-01 1:15:00",
    "2015-07-01 1:30:00","2015-07-01 1:45:00","2015-07-01 1:60:00","2015-07-01 2:15:00"))
Run Code Online (Sandbox Code Playgroud)

注意:此表只有一天,表的最后一个值是

2015-07-01 23:60:00
Run Code Online (Sandbox Code Playgroud)

对于任何不明确的点,请随时告诉我,谢谢!

RHe*_*tel 7

在基地R你可以试试这个:

df1$date <- gsub(":60:",":59:",df1$date, fixed = TRUE)    
df1$date <- as.POSIXct(df1$date)
the59s <- grepl(":59:",df1$date)
df1$date[the59s] <- df1$date[the59s] + 60
#> df1
#                 date
#1 2015-07-01 00:15:00
#2 2015-07-01 00:30:00
#3 2015-07-01 00:45:00
#4 2015-07-01 01:00:00
#5 2015-07-01 01:15:00
#6 2015-07-01 01:30:00
#7 2015-07-01 01:45:00
#8 2015-07-01 02:00:00
#9 2015-07-01 02:15:00
Run Code Online (Sandbox Code Playgroud)

我们的想法是让POSIXct执行转换到下一个小时/天/月/ ...由"60分钟"值触发.为此,我们首先确定包含:60:和替换该部分的条目:59:.然后该列将转换为POSIXct对象.然后我们找到包含":59:"的所有条目并添加60(秒),从而将时间/日期转换为预期格式.


在OP描述的情况下,数据仅包含四分之一小时值0,15,30,40,60.更一般的情况可能包括不应转换为下一小时的真正59分钟值.在执行转换之前,最好存储相关的行索引:

the60s <- grepl(":60:", df1$date)
df1$date <- gsub(":60:",":59:",df1$date, fixed = TRUE)    
df1$date <- as.POSIXct(df1$date)
df1$date[the60s] <- df1$date[the60s] + 60
Run Code Online (Sandbox Code Playgroud)

数据:

df1 <- structure(list(date = structure(1:9, .Label = c("2015-07-01 0:15:00", 
 "2015-07-01 0:30:00", "2015-07-01 0:45:00", "2015-07-01 0:60:00", 
 "2015-07-01 1:15:00", "2015-07-01 1:30:00", "2015-07-01 1:45:00", 
 "2015-07-01 1:60:00", "2015-07-01 2:15:00"), class = "factor")), 
 .Names = "date", row.names = c(NA, -9L), class = "data.frame")
Run Code Online (Sandbox Code Playgroud)