【问题标题】:How to get numeric time of day from XTS index, with correct timezone?如何使用正确的时区从 XTS 索引中获取数字时间?
【发布时间】:2018-06-08 05:14:08
【问题描述】:

我需要一个快速的数字表示一天中的时间。 让我们从一些基本数据开始:

> z1 = structure(
+   c(1:5),.Dim = c(5L, 1L), .Dimnames = list(NULL, c("Hour")),
+   index = as.POSIXct(paste("2018-06-06",paste(1:5,":00:00",sep = ""),sep = " "), tz = 'America/Chicago'),
+   .indexCLASS = c("POSIXct", "POSIXt"), .indexTZ = 'America/Chicago',
+   tclass = c("POSIXct", "POSIXt"), tzone = 'America/Chicago', class = c("xts", "zoo"))
> z1
                    Hour
2018-06-06 01:00:00    1
2018-06-06 02:00:00    2
2018-06-06 03:00:00    3
2018-06-06 04:00:00    4
2018-06-06 05:00:00    5
> index(z1[1])
[1] "2018-06-06 01:00:00 CDT"

所以我有 5 次按芝加哥时间或 CDT 小时计算。 我需要能够查看时间,例如凌晨 1 点,并获得数字时间,例如 1/24 = .0416666667。 XTS 索引采用日期时间格式或从 1970 年 1 月 1 日开始的秒数,因此使用模函数 %% 计算应该很简单。 让我们试试:

> cbind(z1,(unclass(index(z1)) %% (60*60*24))/(60*60*24),(unclass(index(z1)) %% (60*60*24))/(60*60*24)*24)
                    Hour       ..2 ..3
2018-06-06 01:00:00    1 0.2500000   6
2018-06-06 02:00:00    2 0.2916667   7
2018-06-06 03:00:00    3 0.3333333   8
2018-06-06 04:00:00    4 0.3750000   9
2018-06-06 05:00:00    5 0.4166667  10

我取消分类索引(具有相同的值 rcpp 将看到)然后对一天中的秒数进行取模,得到剩余的天数和剩余的小时数。 问题显然是时区。一天中的结果时间在 UTC 时区,但我需要它芝加哥时间,就像 XTS 对象一样。如果我可以简单地获得时区的数字偏移量,那将很容易,但似乎获得偏移量并不是那么简单。

所以,我需要 rcpp 中的一个函数,如果给定 XTS 时间,它将给我正确时区的一天中的时间。它可以是几天、几小时或其他任何时间,只要它是数字且快速的。

此 TimeOfDay 函数的预期用途是在典型的工作日上午 9 点到下午 5 点运行代码。

if(TimeOfDay(Index(1)) > 9.0 && TimeOfDay(Index(1)) < 17.0)
{
   //Code to run.
}

【问题讨论】:

  • 你确定需要 Rcpp 吗?这只是来自as.POSIXct 等的“数学”时间。
  • 我特别需要它用于 Rcpp,因为我在非常大的数据集上运行它,并且需要一种快速的方法来获取一天中的时间而不依赖于 R。谢谢。
  • 相信我,你不需要 Rcpp,而且我已经编写了相当多的 R 和 Rcpp 以及 C++ 代码。但是您的问题并不清楚,因为尽管写了几段,但我仍然不完全确定您在这里想要什么。
  • 我只需要一天中的时间,所以对于“2018-06-06 01:00:00 CDT”或 1518678000,结果应该是:1 小时,或 .046666667 天,或60 分钟或 3600 秒,我需要它在 Rcpp 中运行。
  • 在下面查看我的答案;我给读者添加了myhour/24myhour*60myhour*60*60 扩展名。如果你“必须”在 Rcpp 中有它,我担心你可能不得不写它。但是您可以轻松转换为timestruct tm——C 级别的标准时间计算。 Rcpp 源代码也会给你提示。

标签: c++ datetime rcpp


【解决方案1】:

这是一个非常简单的解决方案,使用data.table中的便利功能:

R> z2 <- data.table(pt=index(z1))
R> z2[, myhour:=hour(pt)][]
                    pt myhour
1: 2018-06-06 01:00:00      1
2: 2018-06-06 02:00:00      2
3: 2018-06-06 03:00:00      3
4: 2018-06-06 04:00:00      4
5: 2018-06-06 05:00:00      5
R> 

我们只是传入POSIXct 对象,并从中派生小时。您将很难在本土 C/C++ 代码中击败它——而且这个解决方案已经存在。

【讨论】:

  • 谢谢,但不是 hour 只返回小时值,而不是一天中的全部时间。这意味着 POSIXct 已经完成了数学运算并解析了小时、分钟、秒的各个值,然后我需要将它们重新组合在一起。更简单的问题,POSIXct 有什么方法可以获取时区的偏移值?谢谢。
猜你喜欢
  • 1970-01-01
  • 2016-10-21
  • 2021-03-13
  • 2013-04-07
  • 1970-01-01
  • 2015-03-11
  • 1970-01-01
  • 1970-01-01
  • 2015-07-29
相关资源
最近更新 更多