【问题标题】:R Lubridate Daylight Savings Times appears NAR Lubridate Daylight Savings Times 出现 NA
【发布时间】:2016-12-05 00:59:22
【问题描述】:

我正在处理一个数据集,该数据集包含从 2016 年 1 月 1 日到 2016 年 8 月 31 日的数百万条时间戳记录。它们被读入为字符,我将它们转换为:

 dt$dropoffDT<-strptime(dt$dropoffDT, format="%Y-%m-%d %H:%M:%S")

除了 2016 年 3 月 13 日凌晨 2 点到 3 点之间的记录外,它们都正确转换。夏令时从 13 日凌晨 2 点开始。

这些记录打印为日期时间,但似乎记录为 NA,使我无法进一步操作这些字段。这是我隔离这些记录的数据集的头部和摘要:

head(dropDT)
                 dropoffDT
15403  2016-03-13 02:09:45
25304  2016-03-13 02:15:52
314784 2016-03-13 02:01:00
429343 2016-03-13 02:05:25
475529 2016-03-13 02:08:00
503665 2016-03-13 02:00:10

summary(dropDT)
   dropoffDT  
 Min.   :NA   
 1st Qu.:NA   
 Median :NA   
 Mean   :NA   
 3rd Qu.:NA   
 Max.   :NA   
 NA's   :192  

感谢您的想法。谢谢!

【问题讨论】:

    标签: r lubridate


    【解决方案1】:

    转换例程有一种方法用于以非 DST 为基础编码的日期时间。考虑一直使用“UCT”(或“GMT”):

    as.POSIXct(dt$dropoffDT, format="%Y-%m-%d %H:%M:%S",  usetz=TRUE, tz="UCT")
    

    MCVE:

    dt <- #  made with dput(dt)
    structure(list(dropoffDT = structure(c(1L, 5L, 2L, 3L, 4L, 6L
    ), .Label = c("2016-03-12 02:09:45", "2016-03-13 02:01:00", "2016-03-13 02:05:25", 
    "2016-03-13 02:08:00", "2016-03-13 02:15:52", "2016-03-14 02:00:10"
    ), class = "factor")), .Names = "dropoffDT", class = "data.frame", row.names = c(NA, 
    -6L))
    
     as.POSIXct(dt$dropoffDT, format="%Y-%m-%d %H:%M:%S",  usetz=TRUE, tz="GMT")
    
    [1] "2016-03-12 02:09:45 GMT" "2016-03-13 02:15:52 GMT"
    [3] "2016-03-13 02:01:00 GMT" "2016-03-13 02:05:25 GMT"
    [5] "2016-03-13 02:08:00 GMT" "2016-03-14 02:00:10 GMT"
    

    我后来才看到lubridate 方面。我不是那个包的用户。扫描带有字母tz 的函数让我认为这些函数需要已经具有“日期时间”格式的参数。

    我发现 R 中的时区参数非常令人困惑(而且我不是唯一一个:Confused by DateTime offsets。)该提问者具有正确的格式来指定具有偏移量的非 DST 区域:美国太平洋标准区,其中我是tz="Etc/GMT+8",注意到尽管我们的时间需要比伦敦的时间少 8 小时,但还是使用了加号。

    当我在处理这些方面时,我通常需要进行测试:

     strftime( Sys.time(),  usetz=TRUE, tz="Etc/GMT-7")
    #[1] "2016-12-04 23:53:42 GMT-7"
    # No, it's not midnight here
     strftime( Sys.time(),  usetz=TRUE, tz="Etc/GMT+7")
    #[1] "2016-12-04 09:53:52 GMT+7"
    
    # it's not  9:53A either
     strftime( Sys.time(),  usetz=TRUE)
    #[1] "2016-12-04 08:54:13 PST"
     strftime( Sys.time(),  usetz=TRUE, tz="Etc/GMT+8")
    #[1] "2016-12-04 08:54:26 GMT+8"
    

    【讨论】:

      猜你喜欢
      • 2021-07-25
      • 1970-01-01
      • 2021-12-30
      • 1970-01-01
      • 2014-11-21
      • 1970-01-01
      • 2022-11-25
      • 2020-07-16
      • 1970-01-01
      相关资源
      最近更新 更多