DST附近的as.POSIXct和strptime行为异常

时间:2018-12-24 15:53:22

标签: r posixct strptime

我遇到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()的行为方式异常。几天来我一直在研究这个问题,但无法解决,因此将不胜感激。

0 个答案:

没有答案