【问题标题】:Sequence of time stamps every three hours每三个小时的时间戳序列
【发布时间】:2016-11-28 01:07:40
【问题描述】:

我希望每三个小时创建一个在特定日期开始和结束的时间戳序列。我尝试过的方法效果很好,但都有同样的问题。在序列中间的某个地方,PST 到 PDT 之间存在时间转换,我不知道为什么。以下是我尝试过的代码,类似于事先在本网站上提出的问题(Question1Question2):

 TIME1 <- as.POSIXct( "2000-01-01 02:00:00", tz = "America/Los_Angeles")
 TIME2 <- as.POSIXct( "2016-02-29 23:00:00" , tz = "America/Los_Angeles")
 temp <- seq(from = TIME1, to = TIME2, by = "3 hours")

当我查看temp 的输出时,一开始看起来不错,除非查看下面的指定区间

 temp[720:745] 

[1] "2000-03-30 23:00:00 PST" "2000-03-31 02:00:00 PST" "2000-03-31 05:00:00 PST" "2000-03-31 08:00:00 PST" "2000-03-31 11:00:00 PST" "2000-03-31 14:00:00 PST"
[7] "2000-03-31 17:00:00 PST" "2000-03-31 20:00:00 PST" "2000-03-31 23:00:00 PST" "2000-04-01 02:00:00 PST" "2000-04-01 05:00:00 PST" "2000-04-01 08:00:00 PST"
[13] "2000-04-01 11:00:00 PST" "2000-04-01 14:00:00 PST" "2000-04-01 17:00:00 PST" "2000-04-01 20:00:00 PST" "2000-04-01 23:00:00 PST" "2000-04-02 03:00:00 PDT"
[19] "2000-04-02 06:00:00 PDT" "2000-04-02 09:00:00 PDT" "2000-04-02 12:00:00 PDT" "2000-04-02 15:00:00 PDT" "2000-04-02 18:00:00 PDT" "2000-04-02 21:00:00 PDT"
[25] "2000-04-03 00:00:00 PDT" "2000-04-03 03:00:00 PDT"

通知[1] 的输出,它从“2000-03-30 23:00:00 PST”变为“2000-03-31 02:00:00 PST”,即 3 小时,但在[13] 行从“2000-04-01 23:00:00 PST”到“2000-04-02 03:00:00 PDT”。注意那里的时区变化。这发生在整个序列中。任何想法如何避免这种结果?我相信它会自动为我转换夏令时,这是我不想要的。如果我可以将其保留为 LST(当地标准时间),那就太好了。

更新:我最近发现this suggestion,我们只是转换为时区“UTC”来取消夏令时。它有效,只是将所有时间戳标记为UTC。但是,很高兴看看是否还有办法将其保留为 LST。

【问题讨论】:

标签: r time timezone sequence


【解决方案1】:

如果您想将太平洋标准时间 (PST) 作为时区并且不想切换到太平洋夏令时间 (PDT),为什么不直接指定呢? "America/Los Angeles" 表示根据定义在特定时间在洛杉矶有效的时区(包括 DST 切换)...

TIME1 <- as.POSIXct( "2000-01-01 02:00:00", tz = "PST")
TIME2 <- as.POSIXct( "2016-02-29 23:00:00" , tz = "PST")
temp <- seq(from = TIME1, to = TIME2, by = "3 hours") 
temp[720:745]
 [1] "2000-03-30 23:00:00 PST" "2000-03-31 02:00:00 PST"
 [3] "2000-03-31 05:00:00 PST" "2000-03-31 08:00:00 PST"
 [5] "2000-03-31 11:00:00 PST" "2000-03-31 14:00:00 PST"
 [7] "2000-03-31 17:00:00 PST" "2000-03-31 20:00:00 PST"
 [9] "2000-03-31 23:00:00 PST" "2000-04-01 02:00:00 PST"
[11] "2000-04-01 05:00:00 PST" "2000-04-01 08:00:00 PST"
[13] "2000-04-01 11:00:00 PST" "2000-04-01 14:00:00 PST"
[15] "2000-04-01 17:00:00 PST" "2000-04-01 20:00:00 PST"
[17] "2000-04-01 23:00:00 PST" "2000-04-02 02:00:00 PST"
[19] "2000-04-02 05:00:00 PST" "2000-04-02 08:00:00 PST"
[21] "2000-04-02 11:00:00 PST" "2000-04-02 14:00:00 PST"
[23] "2000-04-02 17:00:00 PST" "2000-04-02 20:00:00 PST"
[25] "2000-04-02 23:00:00 PST" "2000-04-03 02:00:00 PST"

建议使用 UTC 的 referenced question 表示三个字母的时区代码可能不明确(例如,澳大利亚和北美都有东部标准时间,尽管 this reference 建议将澳大利亚时间编码为 AEST) .您当然应该仔细检查您的结果,因为以这种方式编码的时区很有可能是特定于操作系统的......

【讨论】:

  • "PST" 不是有效的时区,因此并不表示“太平洋标准时间”。它是太平洋标准时间的缩写,但也可能是其他时区的缩写。
  • 好的;你建议我删除这个答案吗? (FWIW,看起来tz=PST 确实给出了与tz=GMT-8 相同的答案,所以也许操作系统时间/日期库猜对了?
  • 看起来tz = "PST" 给出的答案与tz = "GMT-8" 不同。打印答案的 格式 是相同的(缩写时区除外),但基础值不同(例如,比较在每个对象上调用 unclass 的结果)。当tz = "PST" 时,基础值都是UTC(例如.POSIXct(unclass(temp), tz="UTC"))。无需删除您的答案......尽管编辑和更新/澄清任何让您认为应该删除的内容可能会很好。
【解决方案2】:

通知[1] 的输出,它从“2000-03-30 23:00:00 PST”变为“2000-03-31 02:00:00 PST”,即 3 小时,但在[13] 行从“2000-04-01 23:00:00 PST”到“2000-04-02 03:00:00 PDT”。

请注意,“2000-04-01 23:00:00 PST”到“2000-04-02 03:00:00 PDT”也是 3 小时。

如果您想要一个不遵守夏令时,但与 GMT 的偏移量与您当前的本地时间相同的时区,那么您可以尝试时区名称部分中的建议?timezone:

大多数平台支持“GMT+n”和“GMT-n”形式的时区,它们假定与 UTC 有固定的偏移量(因此没有 DST)。

R> TIME1 <- as.POSIXct( "2000-01-01 02:00:00", tz = "GMT-8")
R> TIME2 <- as.POSIXct( "2016-02-29 23:00:00", tz = "GMT-8")
R> temp <- seq(from = TIME1, to = TIME2, by = "3 hours")
R> temp[720:745] 
 [1] "2000-03-30 23:00:00 GMT" "2000-03-31 02:00:00 GMT"
 [3] "2000-03-31 05:00:00 GMT" "2000-03-31 08:00:00 GMT"
 [5] "2000-03-31 11:00:00 GMT" "2000-03-31 14:00:00 GMT"
 [7] "2000-03-31 17:00:00 GMT" "2000-03-31 20:00:00 GMT"
 [9] "2000-03-31 23:00:00 GMT" "2000-04-01 02:00:00 GMT"
[11] "2000-04-01 05:00:00 GMT" "2000-04-01 08:00:00 GMT"
[13] "2000-04-01 11:00:00 GMT" "2000-04-01 14:00:00 GMT"
[15] "2000-04-01 17:00:00 GMT" "2000-04-01 20:00:00 GMT"
[17] "2000-04-01 23:00:00 GMT" "2000-04-02 02:00:00 GMT"
[19] "2000-04-02 05:00:00 GMT" "2000-04-02 08:00:00 GMT"
[21] "2000-04-02 11:00:00 GMT" "2000-04-02 14:00:00 GMT"
[23] "2000-04-02 17:00:00 GMT" "2000-04-02 20:00:00 GMT"
[25] "2000-04-02 23:00:00 GMT" "2000-04-03 02:00:00 GMT"
R> attr(temp, "tzone")
[1] "GMT-8"

【讨论】:

  • 我能够复制您的输出,但是,我确实收到了 GMT-8 是未知时区的警告。但这也可能是一个不错的选择。谢谢你的建议
猜你喜欢
  • 2018-07-17
  • 1970-01-01
  • 2015-03-04
  • 1970-01-01
  • 2020-04-19
  • 2018-09-23
  • 2018-03-10
  • 2020-01-07
  • 1970-01-01
相关资源
最近更新 更多