无法处理POSIXct时区并截断POSIXct对象的超时

时间:2015-07-17 14:06:15

标签: r datetime posixct

我有以下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] ""
> 

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

- &GT;这是我的自然问题:

1)当我根本没有指定时区时,为什么他们用不同的时区进行初始化?

2)为什么两个物体显然没有时区同时......为什么他们有不同的时区呢?

3)我怎样才能使as.Date(y) == "2015-07-17"成立?即如何将两者都设置为当前时区? Sys.timezone()导致'NA'...(编辑:我的时区[德国]似乎是“CET” - &gt;如何将两者都设置为CET?)

我在这里摸不着头...感谢您对此与我分享的任何想法: - )

FW

2 个答案:

答案 0 :(得分:2)

如果您没有指定时区,则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")

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

如果您想保留CET但从不使用CEST,您可以使用不会观察夏令时的位置。根据{{​​3}},您唯一的选择是阿尔及利亚和突尼斯。根据{{​​3}},有效的tz将是&#34; Africa / Algiers&#34;。因此你可以做到

 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,可以更改时区,而不会更改初始时区设置错误但时间合适的情况的时间。

答案 1 :(得分:1)

补充答案:

1)从一开始就使用正确的时区。由于我住在德国汉堡,对我而言,正确的时区是“欧洲/柏林”,请参见Dean所说的this list

2)为了从POSIXct中提取信息,例如日期,我使用

questions = forms.CharField(help_text="Do you have any questions?", widget=forms.Textarea, required=False)
about_yourself = forms.CharField(help_text="Tell us about yourself", widget=forms.Textarea, required=False)

这很慢但似乎给出了正确的答案......而且我没有必要安装新的软件包[在我的情况下这有点复杂]。