为什么我在R中舍入时间时会删除一些日期时间值?

为什么我在R中舍入时间时会删除一些日期时间值?,r,datetime,rounding,na,posixlt,R,Datetime,Rounding,Na,Posixlt,我正在将一系列csv文件导入R。这些文件包含日期/时间列、id和两列温度值 这将给出数据外观的示例: id<-c(1,2,3,4) date.time<-as.character(c("12/03/17 00:21:28", "12/03/17 02:21:28", "12/03/17 04:21:28", "12/03/17 06:21:28")) temp1<-c(-3.568,-3.568,-3.598,-3.598) temp2<-c(-11.577,-11.57

我正在将一系列csv文件导入R。这些文件包含日期/时间列、id和两列温度值

这将给出数据外观的示例:

id<-c(1,2,3,4)
date.time<-as.character(c("12/03/17 00:21:28", "12/03/17 02:21:28", "12/03/17 04:21:28", "12/03/17 06:21:28"))
temp1<-c(-3.568,-3.568,-3.598,-3.598)
temp2<-c(-11.577,-11.577,-11.541,-11.433)
df<-data.frame(id,date.time,temp1,temp2)
但是,我想将date.time列的时间部分四舍五入到最接近的小时。我一直在使用:

df$date.time<-round(df$date.time, units="hours")
据我所知,日期/时间值可能很挑剔,但这似乎是奇怪的随机值

是否有人知道是什么导致了这个问题,以及是否有更好的方法来舍入POSIXlt值的时间部分

更新:似乎只有3月12日凌晨2点被删除的时间。因此,许多应该四舍五入到2017-03-12 02:00:00的时间正在被NAs取代。但并非所有csv文件都会出现这种情况,只有大约一半。为什么R在阅读这个特定日期时遇到问题


谢谢

不为
strtime
添加时区会损坏字符串

让我们看看
df$date.time
标题。缺少/不同的时区

 head(df$date.time)
[1] "2017-03-12 00:21:28 PST"
[2] "2017-03-12 02:21:28"    
[3] "2017-03-12 04:21:28 PDT"
[4] "2017-03-12 06:21:28 PDT"
通过将
tz=“GMT0”
添加到您的
strtime
函数中,您应该会得到所需的结果

df$date.time<-strptime(df$date.time, "%d/%m/%y %H:%M:%S", tz="GMT0")
df$date.time<- as.POSIXlt(df$date.time, "%Y/%m/%d %H:%M:%S", tz="GMT0")
df$date.time<-round(df$date.time, units="hours")

> head(df$date.time)
[1] "2017-03-12 00:00:00 GMT"
[2] "2017-03-12 02:00:00 GMT"
[3] "2017-03-12 04:00:00 GMT"
[4] "2017-03-12 06:00:00 GMT"

df$date.time我最喜欢的从字符串转换日期的方法是使用
lubridate
包。您可以将
strtime
as.POSIXlt
行替换为

library(lubridate)
df$date.time = dmy_hms(df$date.time)
并将其循环到如下时间:

df$date = round_date(df$date.time, "hour")
df$date.time<-strptime(df$date.time, "%d/%m/%y %H:%M:%S", tz="GMT0")
df$date.time<- as.POSIXlt(df$date.time, "%Y/%m/%d %H:%M:%S", tz="GMT0")
df$date.time<-round(df$date.time, units="hours")

> head(df$date.time)
[1] "2017-03-12 00:00:00 GMT"
[2] "2017-03-12 02:00:00 GMT"
[3] "2017-03-12 04:00:00 GMT"
[4] "2017-03-12 06:00:00 GMT"
library(lubridate)
df$date.time = dmy_hms(df$date.time)
df$date = round_date(df$date.time, "hour")