如何以正确的时区从XTS索引中获取数字时间?



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

> 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++代码中击败它 - 这个解决方案已经存在。

最新更新