我需要一天中时间的快速数字表示。 让我们从一些基本数据开始:
> 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-01-01 的秒数,因此使用模函数 %% 的数学应该很简单。 让我们试试:
> 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.
}
这是一个非常简单的解决方案,使用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++代码中击败它 - 这个解决方案已经存在。