首页 文章

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

提问于
浏览
0

我将一系列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)

因为日期/时间不是我想要的格式,所以我一直在使用strptime并将它们格式化为POSIXlt .

喜欢:

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

这工作正常,并提供如下数据:

id  date.time            temp1   temp2
1   2017-03-12 0:21:28  -3.568  -11.577
2   2017-03-12 2:21:28  -3.568  -11.577
3   2017-03-12 4:21:28  -3.598  -11.541
4   2017-03-12 6:21:28  -3.598  -11.433

但是,我想将date.time列的时间部分舍入到最近的小时 . 我一直在用:

df$date.time<-round(df$date.time, units="hours")

99%的时间都可以正常工作 . 但是,在某些文件中,R正在删除date.time值,看似随机,并给出NA . 每个文件中只有一个或两个值被删除,我看不出这些特定值会被删除的原因 . 例如:

id  date.time         temp1   temp2
1   2017-03-12 0:00:00  -3.568  -11.577
2   NA                  -3.568  -11.577
3   2017-03-12 4:00:00  -3.598  -11.541
4   2017-03-12 6:00:00  -3.598  -11.433

从我所读到的,日期/时间值可能很挑剔,但这似乎奇怪随机 .

有谁知道可能导致这个问题的原因,是否有更好的方法来计算POSIXlt值的时间部分?

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

谢谢!

2 回答

  • 0

    不为 strptime 添加时区会破坏您的字符串 .

    让我们看看 headhead . 缺少/不同的时区 .

    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" 添加到 strptime 函数,您应该得到所需的结果 .

    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"
    
  • 1

    我最喜欢的从字符串转换日期的方法是使用 lubridate 包 . 您可以用 strtimeas.POSIXlt 替换

    library(lubridate)
    df$date.time = dmy_hms(df$date.time)
    

    把它围绕成几个小时:

    df$date = round_date(df$date.time, "hour")
    

相关问题