R Lubridate夏令时出现在NA

时间:2016-12-04 15:41:47

标签: r lubridate

我正在使用从2016年1月1日到2016年8月31日期间拥有数百万时间戳记录的数据集。它们作为字符读入,我将其转换为:

<?xml version='1.0' encoding='utf-8'?>
<widget id="com.phonegap.helloworld" version="1.0.0" xmlns="http://www.w3.org/ns/widgets" xmlns:gap="http://phonegap.com/ns/1.0">
<name>yal</name>
<description>
    A blank PhoneGap app.
</description>
<author email="support@phonegap.com" href="http://phonegap.com">
    PhoneGap Team
</author>
<content src="index.html" />
<access origin="*" />
<plugin name="cordova-sqlite-ext" spec="~0.10.2" />

除了2016年3月13日凌晨2点到3点之间的记录外,它们都正确转换。夏令时从第13马赫的凌晨2点开始。

这些记录打印为日期时间,但似乎记录为NA,这使我无法进一步操作字段。以下是我隔离这些记录的数据集的头部和摘要:

 dt$dropoffDT<-strptime(dt$dropoffDT, format="%Y-%m-%d %H:%M:%S")

你的想法很赞赏。谢谢!

1 个答案:

答案 0 :(得分:0)

转换例程具有在非DST基础中编码的日期时间的方法。考虑使用&#34; UCT&#34; (或&#34; GMT&#34;)适用于所有时间:

as.POSIXct(dt$dropoffDT, format="%Y-%m-%d %H:%M:%S",  usetz=TRUE, tz="UCT")

MCVE:

dt <- #  made with dput(dt)
structure(list(dropoffDT = structure(c(1L, 5L, 2L, 3L, 4L, 6L
), .Label = c("2016-03-12 02:09:45", "2016-03-13 02:01:00", "2016-03-13 02:05:25", 
"2016-03-13 02:08:00", "2016-03-13 02:15:52", "2016-03-14 02:00:10"
), class = "factor")), .Names = "dropoffDT", class = "data.frame", row.names = c(NA, 
-6L))

 as.POSIXct(dt$dropoffDT, format="%Y-%m-%d %H:%M:%S",  usetz=TRUE, tz="GMT")

[1] "2016-03-12 02:09:45 GMT" "2016-03-13 02:15:52 GMT"
[3] "2016-03-13 02:01:00 GMT" "2016-03-13 02:05:25 GMT"
[5] "2016-03-13 02:08:00 GMT" "2016-03-14 02:00:10 GMT"

我之后才看到lubridate方面。我不是该套餐的用户。使用字母tz扫描函数使我认为这些函数需要在“日期时间”格式中使用参数。

我发现R中的时区参数非常混乱(而且我不是唯一的:Confused by DateTime offsets。)该提问者使用正确的格式来指定具有偏移的非DST区域:美国我所在的太平洋标准区tz="Etc/GMT+8",注意到使用了加号,尽管我们的时间需要比伦敦时间少8小时。

当我在这些方面工作时,我通常需要进行测试:

 strftime( Sys.time(),  usetz=TRUE, tz="Etc/GMT-7")
#[1] "2016-12-04 23:53:42 GMT-7"
# No, it's not midnight here
 strftime( Sys.time(),  usetz=TRUE, tz="Etc/GMT+7")
#[1] "2016-12-04 09:53:52 GMT+7"

# it's not  9:53A either
 strftime( Sys.time(),  usetz=TRUE)
#[1] "2016-12-04 08:54:13 PST"
 strftime( Sys.time(),  usetz=TRUE, tz="Etc/GMT+8")
#[1] "2016-12-04 08:54:26 GMT+8"