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

问题描述 投票:12回答:2

[我一直试图查看一个数据帧,以提取POSIXct列的日期部分与某个值匹配的所有行。我遇到了以下内容,这很使我感到困惑:日期。

as.Date(as.POSIXct(...))

为什么'2012-08-06 09:35:23'等于'2012-08-05

[我怀疑这与所使用的不同时区有关,因此请注意,> dt <- as.POSIXct('2012-08-06 09:35:23') [1] "2012-08-06 09:35:23 EST" > as.Date(dt) [1] "2012-08-05" 的时区为'EST',因此我将其指定给dt ::

as.Date

但是它仍然返回2012-08-05。

为什么?如何查找数据框中日期为2012-08-06的所有日期时间? (因为> as.Date(as.POSIXct('2012-08-06 09:35:23'), tz='EST') [1] "2012-08-05" 不会在日期时间为subset(my.df, as.character(as.Date(datetime), tz='EST') == '2012-08-06')的情况下返回行,即使这确实发生在日期2012-08-06 ...)?

[添加的详细信息:Linux 64位(虽然可以在32位上复制),可以在R 3.0.1和3.0.0上获得,并且我目前是AEST(澳大利亚东部标准时间)

r datetime timezone
2个回答
13
投票
执行此操作的安全方法是通过dt传递日期值。这确实会创建一个额外的步骤,但是如果format格式为“-”或“ /”,则它将接受字符结果:

as.Date

时区文档也使我感到困惑。在某些情况下(事实证明是这种情况),EST可能并不明确,实际上可能指的是澳大利亚的tz。如果您碰巧在北美,请尝试“ EST5EDT”或“ America / New_York”。

在这种情况下,由于我得到的是“ 2012-08-06”,因此未声明的操作系统处理“ tz”参数的方式也有所不同。 (虽然我不确定那应该很重要,但我目前处于PDT US tz模式。)更改哪个函数获取tz参数可能会((或不))澄清:

as.Date( format( as.POSIXct('2019-03-11 23:59:59'), "%Y-%m-%d") ) [1] "2019-03-11" as.Date( as.POSIXct('2019-03-11 23:59:59') ) # I'm in a locale where the problem might exist [1] "2019-03-12"

如果省略> 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"
中的tz,则采用UTC。 

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

as.POSIXct


10
投票
这里有澳大利亚同伴(布里斯班位置,Win7 Enterprise 64位,R3.0.1):

我可以复制您的问题:

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"

因为> 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"
默认为as.Date(GMT),如UTC中列出:

?as.Date

然后将## S3 method for class 'POSIXct'
as.Date(x, tz = "UTC", ...) 
表示强制为UTC,然后按预期方式工作:

POSIXct

或者,将它们与我的本地> dt <- as.POSIXct('2012-08-06 09:35:23',tz="UTC")
> as.Date(dt)
[1] "2012-08-06"
匹配也可以:

tz

编辑:> dt <- as.POSIXct('2012-08-06 09:35:23',tz="Australia/Brisbane") > as.Date(dt,tz="Australia/Brisbane") [1] "2012-08-06" 规范的歧义似乎对我来说是个问题:

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 > -应该与默认值相同

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 >

差异

> 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 >
© www.soinside.com 2019 - 2024. All rights reserved.