处理R

时间:2016-08-25 09:35:53

标签: r date time 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 

我想做的是

  • 以标准格式制作,如: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"))

注意:此表仅用于一天,表的最后一个值为

2015-07-01 23:60:00

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

1 个答案:

答案 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")