as.Date(as.POSIXct())给出错误的日期?

mat*_*fee 11 timezone datetime r

我一直在试图查看一个数据帧,提取POSIXct列的日期组件与某个值匹配的所有行.我遇到了以下令我困惑的东西:: as.Date(as.POSIXct(...))并不总是返回正确的日期.

> dt <- as.POSIXct('2012-08-06 09:35:23')
[1] "2012-08-06 09:35:23 EST"
> as.Date(dt)
[1] "2012-08-05"
Run Code Online (Sandbox Code Playgroud)

为什么是"2012-08-之日起06 9时35分23秒"等于"2012-08- 05?

我怀疑它与使用的不同时区有关,所以注意到dt'EST' 的时区我给了as.Date::

> as.Date(as.POSIXct('2012-08-06 09:35:23'), tz='EST')
[1] "2012-08-05"
Run Code Online (Sandbox Code Playgroud)

但它仍然会回归2012-08-05.

为什么是这样?如何查找2012-08-06日期数据框中的所有日期时间?(因为即使在2012-08-06的日期确实发生了这种情况,subset(my.df, as.character(as.Date(datetime), tz='EST') == '2012-08-06')也不会返回带有日期时间的行dt...)?

补充细节:Linux 64bit(虽然可以在32位上重现),可以在R 3.0.1和3.0.0上得到这个,我目前是AEST(澳大利亚东部标准时间)

42-*_*42- 13

时区的文档也让我感到困惑.在某些情况下,EST可能不是明确的,实际上可能是指澳大利亚的tz.试试"EST5EDT"或"America/New_York".

在这种情况下,它还可能与您未说明的操作系统处理'tz'参数的方式有所不同,因为我得到了"2012-08-06".(我现在在PDT US tz,虽然我不确定这应该重要.)更改哪个函数获取tz参数可能会澄清(或不):

> as.Date(as.POSIXct('2012-08-06 19:35:23', tz='EST'))
[1] "2012-08-07"
> as.Date(as.POSIXct('2012-08-06 17:35:23', tz='EST'))
[1] "2012-08-06"


> as.Date(as.POSIXct('2012-08-06 21:35:23'), tz='EST')
[1] "2012-08-06"
> as.Date(as.POSIXct('2012-08-06 22:35:23'), tz='EST')
[1] "2012-08-07"
Run Code Online (Sandbox Code Playgroud)

如果省略tz,as.POSIXct则假设为UTC.

这些是Ozzie TZ的明确名称(至少在我的Mac上):

tzfile <- "/usr/share/zoneinfo/zone.tab"
tzones <- read.delim(tzfile, row.names = NULL, header = FALSE,
    col.names = c("country", "coords", "name", "comments"),
    as.is = TRUE, fill = TRUE, comment.char = "#")
grep("^Aus", tzones$name, value=TRUE)
 [1] "Australia/Lord_Howe"   "Australia/Hobart"     
 [3] "Australia/Currie"      "Australia/Melbourne"  
 [5] "Australia/Sydney"      "Australia/Broken_Hill"
 [7] "Australia/Brisbane"    "Australia/Lindeman"   
 [9] "Australia/Adelaide"    "Australia/Darwin"     
[11] "Australia/Perth"       "Australia/Eucla" 
Run Code Online (Sandbox Code Playgroud)


the*_*ail 9

澳大利亚同志在这里(布里斯班位置,Win7 Enterprise 64位,R3.0.1):

我可以复制你的问题:

> dt <- as.POSIXct('2012-08-06 09:35:23')
> dt
[1] "2012-08-06 09:35:23 EST"
> as.Date(dt)
[1] "2012-08-05"
Run Code Online (Sandbox Code Playgroud)

由于as.Date默认为UTC(GMT),如下所示?as.Date:

## S3 method for class 'POSIXct'
as.Date(x, tz = "UTC", ...) 
Run Code Online (Sandbox Code Playgroud)

强制POSIXct表示为UTC然后按预期工作:

> dt <- as.POSIXct('2012-08-06 09:35:23',tz="UTC")
> as.Date(dt)
[1] "2012-08-06"
Run Code Online (Sandbox Code Playgroud)

或者,将它们与我当地的tz工作相匹配也很好:

> dt <- as.POSIXct('2012-08-06 09:35:23',tz="Australia/Brisbane")
> as.Date(dt,tz="Australia/Brisbane")
[1] "2012-08-06"
Run Code Online (Sandbox Code Playgroud)

编辑:对EST规范的歧义似乎对我来说是个问题:

默认使用 as.POSIXct

> dt.def <- as.POSIXct("2012-01-01 22:00:00")
> dt.def
[1] "2012-01-01 22:00:00 EST"
> as.numeric(dt.def)
[1] 1325419200
> 
Run Code Online (Sandbox Code Playgroud)

不明确EST- 应该与默认相同

> dt.est <- as.POSIXct("2012-01-01 22:00:00",tz="EST")
> dt.est
[1] "2012-01-01 22:00:00 EST"
> as.numeric(dt.est)
[1] 1325473200
> 
Run Code Online (Sandbox Code Playgroud)

毫不含糊的澳大利亚布里斯班时区

> dt.bris <- as.POSIXct("2012-01-01 22:00:00",tz="Australia/Brisbane")
> dt.bris
[1] "2012-01-01 22:00:00 EST"
> as.numeric(dt.bris )
[1] 1325419200
> 
Run Code Online (Sandbox Code Playgroud)

差异

> dt.est - dt.def
Time difference of 15 hours
> dt.est - dt.bris
Time difference of 15 hours
> dt.bris - dt.def
Time difference of 0 secs
Run Code Online (Sandbox Code Playgroud)