【发布时间】: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/24、myhour*60和myhour*60*60扩展名。如果你“必须”在 Rcpp 中有它,我担心你可能不得不写它。但是您可以轻松转换为time和struct tm——C 级别的标准时间计算。 Rcpp 源代码也会给你提示。