gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 22:22:45 25 4
gpt4 key购买 nike

我一直在尝试查看一个数据框,提取 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"

为什么日期“2012-08-06 09: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"

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

这是为什么呢?如何找到数据框中 2012 年 8 月 6 日的所有日期时间? (因为 subset(my.df, as.character(as.Date(datetime), tz='EST') == '2012-08-06') 不会返回日期时间 dt 的行,即使这确实发生在日期 2012-08-06...)?

添加详细信息:Linux 64 位(尽管可以在 32 位上重现),可以在 R 3.0.1 和 3.0.0 上获得此信息,并且我目前是 AEST(澳大利亚东部标准时间)

最佳答案

执行此操作的安全方法是通过 format 传递日期值。这确实创建了一个额外的步骤,但 as.Date 将接受字符结果(如果其格式为“-”或“/”:

)
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"

时区的文档也让我感到困惑。在某些情况下(事实证明是这种情况),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"

如果您在 as.POSIXct 中省略 tz,则假定为 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"

关于r - as.Date(as.POSIXct()) 给出了错误的日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17098862/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com