【问题标题】:Possible bug in as.POSIXctas.POSIXct 中可能存在的错误
【发布时间】:2019-04-18 22:48:32
【问题描述】:

我正在处理时间数据,并将其转换为 POSIXct 类(读取为字符串)。当我这样做时,它适用于我的所有数据,但不适用于一个特定的字符串。我所做的是本质上:

Time1 <- '1900-04-01' # First Year then Month then Day
Time1_convert <- as.POSIXct( Time1, format='%Y-%m-%d')

我进行了矢量化处理,我的所有数据都得到了很好的转换。但是日期为 1920-05-01

Time1 <- '1920-05-01' 
Time1_convert <- as.POSIXct( Time1, format='%Y-%m-%d' )

这返回不适用。我不知道为什么会这样。如果我添加到 as.POSIXct 函数 tz = 'GMT';时间很好地转换为所有值。我不明白为什么会发生这种情况,以及当我尝试使用超过 1500 个不同的时间值时为什么会发生这种情况。

我添加输出的图像:

添加了更多代码:

for( m in c(01,02,03,04,05,06,07,08,09,10,11,12)){ 
   print(as.POSIXct(paste0('1920-',m,'-01'),format='%Y-%m-%d'))
}

输出是:

[1] "1920-01-01 CMT"
[1] "1920-02-01 CMT"
[1] "1920-03-01 CMT"
[1] "1920-04-01 CMT"
[1] NA
[1] "1920-06-01 -04"
[1] "1920-07-01 -04"
[1] "1920-08-01 -04"
[1] "1920-09-01 -04"
[1] "1920-10-01 -04"
[1] "1920-11-01 -04"
[1] "1920-12-01 -04"

sessionInfo() 的输出:

R version 3.3.3 (2017-03-06)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Debian GNU/Linux 9 (stretch)

locale:
 [1] LC_CTYPE=es_AR.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=es_AR.UTF-8        LC_COLLATE=es_AR.UTF-8    
 [5] LC_MONETARY=es_AR.UTF-8    LC_MESSAGES=es_AR.UTF-8   
 [7] LC_PAPER=es_AR.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=es_AR.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods  
[7] base     

loaded via a namespace (and not attached):
[1] tools_3.3.3

【问题讨论】:

  • 对我也很好。可能是语言环境问题。
  • 确保它实际上是1920-05-01,可能有前导或尾随空格
  • 你能分享sessionInfo()的输出吗?
  • 我怀疑阿根廷当时进行了时间调整。来自这里:opensource.apple.com/source/system_cmds/system_cmds-336.10/… #来自 Paul Eggert (2002-01-22):# spicasc.net/horvera.html"> # Hora de verano para la Republica Argentina (2000-10-01) # 说从 1894 年 10 月 31 日到 1920 年 5 月 1 日,阿根廷的标准时间是 -4:16:48.25。使用这个更精确的值 # 而不是 Shanks。
  • 是的,在此处查看更多信息:statoids.com/tar.html 那是阿根廷更改时区的日期。

标签: r time posixct


【解决方案1】:

您的本地设置似乎位于阿根廷。碰巧的是,阿根廷将该日期的时区从 UTC-4:16:48 重置为 UTC-4。我认为这意味着 1920 年 5 月 5 日在阿根廷没有午夜。当您将该字符串转换为 POSIXct 时,它会在您当地时区的当天午夜解释它,这是巧合是阿根廷不存在的时代。 (这解释了为什么其他尝试相同代码的人无法重现它。)

http://www.statoids.com/tar.html

阿根廷的地点在 1894 年 10 月 31 日 00:00 之前观察到当地平均时间 (转换后测量)。那一刻,全国 同步于科尔多瓦的本地标准时间,即 UTC-4:16:48。这 下一次转换发生在 1920 年 5 月 1 日 00:00,当时设置了时钟 提前 16 分 48 秒成为一个偶数 UTC-4。 阿根廷在 UTC-4 上保持统一,直到第一次夏令时 时间于 1931 年成立。

如果你需要一个 POSIXct 对象,你可以考虑:

a) 指定当天存在午夜的不同时区。

as.POSIXct("1920-05-01", tz = "UTC") 
# Or perhaps other nearby time zones didn't have that specific problem?

b) 将时间存储在组件中,包括一个用于日期,一个用于一天内的时间。例如time = hour(Time1) + minute(Time1)/60。这有点笨拙,但可以执行您需要的日期/时间计算。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-30
    • 2013-10-11
    • 2019-12-22
    • 2012-01-21
    • 2018-12-31
    • 2016-07-30
    相关资源
    最近更新 更多