gpt4 book ai didi

r - 无法处理 POSIXct 时区并截断 POSIXct 对象的时间

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

我有以下一段 R 代码:

formatString = "%Y-%m-%d %H:%M:%OS"
x = as.POSIXct(strptime("2013-11-23 23:10:38.000000", formatString))
y = as.POSIXct(strptime("2015-07-17 01:43:38.000000", formatString))

我有一个问题,当我做 as.Date(y)然后我得到 2015-07-16 (虽然它的日期晚了一天!)。显然问题是时区。所以我检查了时区:
> x
[1] "2013-11-23 23:10:38 CET"
> y
[1] "2015-07-17 01:43:38 CEST"
>

好的,所以他们偏离了他们的时区。这很奇怪,因为为什么 R 决定一个时间戳(根本没有任何时区)与另一个(根本没有任何时区)位于不同的时区?

好的,让我们设置时区。谷歌搜索显示 attr(y, "tzone") <- "CET"应该做的交易。让我们试试这个:
> attr(y, "tzone") <- "CET"
> y
[1] "2015-07-17 01:43:38 CEST"
>

好吧,那没有用。让我们看看一开始的时区实际上是什么:
> formatString = "%Y-%m-%d %H:%M:%OS"
> x = as.POSIXct(strptime("2013-11-23 23:10:38.000000", formatString))
> y = as.POSIXct(strptime("2015-07-17 01:43:38.000000", formatString))
> unclass(x)
[1] 1385244638
attr(,"tzone")
[1] ""
> unclass(y)
[1] 1437090218
attr(,"tzone")
[1] ""
>

所以......他们根本没有时区,但他们的时区不同????

--> 这是我的自然问题:

1)当我根本不指定时区时,为什么它们用不同的时区初始化?

2)为什么两个对象显然都没有时区,同时……为什么它们有不同的时区?

3) 如何制作 as.Date(y) == "2015-07-17"真的? IE。如何将两者都设置为当前时区? Sys.timezone()结果为“NA”...(编辑:我的时区 [德国] 似乎是“CET”--> 如何将两者都设置为 CET?)

我在这里挠头……感谢您与我分享对此的任何想法:-)

固件

最佳答案

如果您没有指定时区,那么 R 将使用您系统的语言环境,因为 POSIXct 对象必须有一个时区。 CEST 和 CET 的区别在于,一个是夏令时,一个不是。这意味着如果您在定义为夏令时的一年中定义了一个日期,那么 R 将决定使用时区的夏令时版本。如果您想设置不使用夏令时版本的日期,则从一开始就将它们定义为 GMT。

formatString = "%Y-%m-%d %H:%M:%OS"
x = as.POSIXct(strptime("2013-11-23 23:10:38.000000", formatString), tz="GMT")
y = as.POSIXct(strptime("2015-07-17 01:43:38.000000", formatString), tz="GMT")

如果要截断时间,请不要使用 as.Date在 POSIXct 对象上,因为 as.Date旨在将字符对象转换为 Date 对象(与 POSIXct 对象不同)。如果你想用基数 R 截断 POSIXct 对象,那么你必须包装 roundtruncas.POSIXct但我建议查看 lubridate用于处理日期和时间的包(特别是 POSIXct 对象)。

如果您想保留 CET 但从不使用 CEST,您可以使用不遵守夏令时的位置。根据 http://www.timeanddate.com/time/zones/cet你唯一的选择是 Algolia 和突尼斯。根据 https://en.wikipedia.org/wiki/List_of_tz_database_time_zones有效的 tz 将是“非洲/阿尔及尔”。因此你可以做
 formatString = "%Y-%m-%d %H:%M:%OS"
x = as.POSIXct(strptime("2013-11-23 23:10:38.000000", formatString), tz="Africa/Algiers")
y = as.POSIXct(strptime("2015-07-17 01:43:38.000000", formatString), tz="Africa/Algiers")

并且 x 和 y 都在 CET 中。

关于设置时区的另一件事。如果你告诉 R 你想要一个通用的时区,那么它不会覆盖夏令时设置。这就是为什么设置 attr(y, "tzone") <- "CET"没有得到想要的结果。如果你这样做了 attr(y, "tzone") <- "Africa/Algiers"那么它会按您的预期工作。但是请注意转换,因为当您更改时区时,它会更改时间以考虑新时区。包裹 lubridate具有功能 force_tz对于初始时区设置错误但时间正确的情况,它会更改时区而不更改时间。

关于r - 无法处理 POSIXct 时区并截断 POSIXct 对象的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31477750/

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