Как получить числовое время суток из индекса XTS с правильным часовым поясом? - PullRequest
0 голосов
/ 07 июня 2018

Мне нужно быстрое числовое представление времени суток.Давайте начнем с некоторых основных данных:

> 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.
}

1 Ответ

0 голосов
/ 08 июня 2018

Вот очень простое решение, использующее вспомогательную функцию в 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 ++ - и это решение уже существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...