首先,我有一个大的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
我想做的是
对于第一个,我尝试使用函数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"))
注意:此表仅用于一天,表的最后一个值为
2015-07-01 23:60:00
对于任何不明确的点,请随时告诉我 谢谢你!
答案 0 :(得分: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
这个想法是让POSIXct执行转换到下一个小时/每天/月/ ...由一个&#34; 60分钟&#34;值。为此,我们首先确定包含:60:
的条目,并将该部分替换为:59:
。然后该列将转换为POSIXct对象。然后我们找到包含&#34;:59的所有条目:&#34;并添加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
数据:强>
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")