Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R POSIXct原点基类型导致时区差异_R_Posixct - Fatal编程技术网

R POSIXct原点基类型导致时区差异

R POSIXct原点基类型导致时区差异,r,posixct,R,Posixct,我在R中使用POSIXct管理时区时遇到问题。我已将TZ选项全局设置为“Europe/London”,但由于我们已切换回GMT,因此已将运行为。POSIXct不再将数字向量转换回正确的时间 深入探究为什么我发现时区的差异可能是由用于设置起始日期的对象类型引起的 例如: # Date time is set as 1 second after 1970-01-01 as.POSIXct(1, origin = "1970-01-01") # [1] "1970-01-01 01:00:01 BST

我在R中使用POSIXct管理时区时遇到问题。我已将
TZ
选项全局设置为
“Europe/London”
,但由于我们已切换回GMT,因此已将
运行为。POSIXct
不再将数字向量转换回正确的时间

深入探究为什么我发现时区的差异可能是由用于设置起始日期的对象类型引起的

例如:

# Date time is set as 1 second after 1970-01-01
as.POSIXct(1, origin = "1970-01-01")
# [1] "1970-01-01 01:00:01 BST"

# Same numeric value, but one hour less now that the origin is set using a POSIXct
as.POSIXct(1, origin = as.POSIXct("1970-01-01"))
# [1] "1970-01-01 00:00:01 BST"
第一个值实际上没有意义,因为查询是在英国夏季以外进行的,而这些查询是在GMT中进行的(请参见下面的结果):

即使在每个阶段明确说明时区,时差仍然存在:

as.POSIXct(1, origin = "1970-01-01", tz = "Europe/London")
# [1] "1970-01-01 01:00:01 BST"

as.POSIXct(1, origin = as.POSIXct("1970-01-01", tz = "Europe/London"), "Europe/London")
# [1] "1970-01-01 00:00:01 BST"
更糟糕的是,
?as.POSIXct
产生的文档对于时区的管理非常模糊,特别是:

如果需要时区,并且指定的时区在您的系统上无效, 发生的情况是系统特定的,但尝试设置它可能会 被忽视

鉴于此,我有一系列问题:

1) 为什么
as.POSIXct(1,origin=“1970-01-01”,tz=“欧洲/伦敦”)
增加了一个小时?即使原始日期将被解析为GMT时间,并且时区已明确设置

2) 从R中的数字转换时,确保R中时区一致的最佳方法是什么


3) 在R中管理时区的最佳实践是什么?是否有很好的参考资料,特别是对于
POSIXct
日期类型。

对于问题1,这里有一点历史。请参见以下BST、GMT和UTC的所有结果。UTC和GMT应该(并且是)相同。 现在,为什么要用第一行代码获得BST?

这是因为在1970年,英国全年都在英国夏令时。实际上,英国在1968-02-18年到1971-10-31年间都在英国夏令时。这意味着当您为“欧洲/伦敦”提供时区时,通过返回“1970-01-01 01:00:01 BST”,R是正确的。有关的详细信息,请参阅

时代:

as.POSIXct(1, origin = "1970-01-01", tz = "Europe/London")
[1] "1970-01-01 01:00:01 BST"
as.POSIXct(1, origin = "1970-01-01", tz = "GMT")
[1] "1970-01-01 00:00:01 GMT"
as.POSIXct(1, origin = "1970-01-01", tz = "UTC")
[1] "1970-01-01 00:00:01 UTC"
问题2:首先你需要知道日期来自哪个时区。然后,要么继续在该时区工作,要么将该时区更改为您的本地时区。或者去掉日期时间对象的时区,这将强制所有内容使用UTC

我想说lubridate的
force_tz
带有tz
功能来强制时区。但既然你不想使用lubridate,就把你的本地时区设置成你需要的任何时区。如果我处理股票数据,我倾向于使用
Sys.setenv(TZ=“UTC”)
,这样当我有不同的本地时间时,xts对象不会抱怨

问题3:这里有一点
这里是一个

如果任何答案不使用lubridate,我们将不胜感激,因为它通过stringr导入stringi,这在某些情况下可能会有问题。谢谢,非常有用。感觉就像英国决定了爱情的夏天是如此美好,它希望接下来的夏天能持续四年……看看为什么英国仍然留在英国夏令时。如果你经常处理这些事情,有趣的阅读:
as.POSIXct(1, origin = "1970-01-01", tz = "Europe/London")
[1] "1970-01-01 01:00:01 BST"
as.POSIXct(1, origin = "1970-01-01", tz = "GMT")
[1] "1970-01-01 00:00:01 GMT"
as.POSIXct(1, origin = "1970-01-01", tz = "UTC")
[1] "1970-01-01 00:00:01 UTC"