Мне нужно быстрое числовое представление времени суток.Давайте начнем с некоторых основных данных:
> 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:00 и получить числовое время, как 1/24 = .0416666667.Индекс XTS представлен в формате Datetime или в секундах с 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:00 до 17:00.
if(TimeOfDay(Index(1)) > 9.0 && TimeOfDay(Index(1)) < 17.0)
{
//Code to run.
}