我正在处理时间数据,并将其隐藏到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种不同的时间值时会发生这种特定值。
添加了更多代码:
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
答案 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
。有点笨拙,但可能可以执行所需的日期/时间计算。