代码之家  ›  专栏  ›  技术社区  ›  user97878

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

  •  1
  • user97878  · 技术社区  · 7 年前

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

    因为日期/时间不是我想要的格式,所以我一直在使用strtime并将其格式化为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
    

    然而,我想把日期的时间部分舍入。时间列到最近的小时。我一直在使用:

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

    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值的时间部分?

    谢谢

    2 回复  |  直到 7 年前
        1
  •  1
  •   D.sen    7 年前

    不为添加时区 strptime 正在腐蚀你的绳子。

    head 属于 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" 给你的

    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"
    
        2
  •  1
  •   lebelinoz    7 年前

    我最喜欢的从字符串转换日期的方法是使用 lubridate strtime as.POSIXlt 带有的线条

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

    并将其四舍五入到如下小时:

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