我遇到as.POSIXct()
的奇怪行为。我已经收集了今年的数据,并试图处理11月4日的DST更改。我在CST6CDT
或"America/Chicago"
中。我的日期数据是一个字符向量,如下所示:
"11/04/2018 1:59 AM"
"11/04/2018 2:00 AM"
"11/04/2018 2:01 AM"
...
"11/11/2018 3:52 PM"
"11/11/2018 2:55 PM"
我设置数据记录器以UTC记录数据,以为以后可以省去DST的麻烦。不幸的是,我用来下载数据的计算机的时间设置为"America/Chicago"
,因此当它连接到数据记录器时,它会将时间切换回一个小时(因此从3:52 PM切换到2:55 PM)
因此,我修复了日期问题,使其看起来像以下内容:
"11/04/2018 1:59 AM"
"11/04/2018 1:00 AM"
"11/04/2018 1:01 AM"
...
"11/11/2018 2:52 PM"
"11/11/2018 2:55 PM"
但是,当我使用as.POSIXct()
更改这些日期时,它以一种奇怪的方式进行了更改。例如。
as.POSIXct("11/04/2018 1:30 AM","%m/%d/%Y %I:%M %p",tz='CST6CDT')
"2018-11-04 01:30:00 CDT"
as.POSIXct("11/04/2018 1:31 AM","%m/%d/%Y %I:%M %p",tz='CST6CDT')
"2018-11-04 01:31:00 CST"
我认为,好的,让我指定系统特定的tz
as.POSIXct("11/04/2018 1:30 AM","%m/%d/%Y %I:%M %p",tz=Sys.timezone())
"2018-11-04 01:30:00 CDT"
as.POSIXct("11/04/2018 1:31 AM","%m/%d/%Y %I:%M %p",tz=Sys.timezone())
"2018-11-04 01:31:00 CST"
也许我需要明确让系统知道两个连续时间在CDT中
as.POSIXct("11/04/2018 1:30 AM CDT","%m/%d/%Y %I:%M %p",tz=Sys.timezone())
"2018-11-04 01:30:00 CDT"
as.POSIXct("11/04/2018 1:31 AM CDT","%m/%d/%Y %I:%M %p",tz=Sys.timezone())
"2018-11-04 01:31:00 CST"
现在我很困惑。我以为as.POSIXct()
自动识别了DST,因此知道"America/Chicago"
中的DST在11月4日观察到,从CDT转换为CST到凌晨2:00。在strptime中也会发生此问题:
strptime("11/04/2018 1:30 AM","%m/%d/%Y %I:%M %p")
"2018-11-04 01:30:00 CDT"
strptime("11/04/2018 1:31 AM","%m/%d/%Y %I:%M %p")
"2018-11-04 01:31:00 CST"
这同时在我使用的R版本R version 3.4.2 (2017-09-28) -- "Short Summer"
和R的最新版本R version 3.5.1 (2018-07-02) -- "Feather Spray"
中发生,并且在32位和64位版本中均发生。
但是,seq.POSIXt(from=as.POSIXct("11/04/2018 1:00 AM","%m/%d/%Y %I:%M %p", tz=Sys.timezone()), length.out=61, by='1 mins')
会产生预期的结果:
[1] "2018-11-04 01:00:00 CDT" "2018-11-04 01:01:00 CDT"
[3] "2018-11-04 01:02:00 CDT" "2018-11-04 01:03:00 CDT"
...
[31] "2018-11-04 01:30:00 CDT" "2018-11-04 01:31:00 CDT"
...
[59] "2018-11-04 01:58:00 CDT" "2018-11-04 01:59:00 CDT"
[61] "2018-11-04 01:00:00 CST"
tl / dr: DST引起了我的问题,因为as.POSIXct()的行为方式异常。几天来我一直在研究这个问题,但无法解决,因此将不胜感激。