as.POSIXct中的可能错误

时间:2018-11-15 18:51:37

标签: r time posixct

我正在处理时间数据,并将其隐藏到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' )

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

我添加输出的图像: Output in RStudio

添加了更多代码:

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

1 个答案:

答案 0 :(得分:2)

您的本地设置似乎位于阿根廷。碰巧的是,阿根廷将该日期的时区从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-05-01 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。有点笨拙,但可能可以执行所需的日期/时间计算。