Мне нужно вычислить "сколько x
единиц измерения" каждый элемент в векторе дат POSIX взят из заданной контрольной даты, где
x
"типичная" единица времени, такая как месяц , неделя , квартал и т. д. - вектор даты может охватывать несколько лет
- результат должен быть
numeric
вектор
У меня есть кое-что, но это не похоже на последовательный подход, который можно обобщить (два разных подхода для месяц и неделя ).
Возможно, ничего не стоит: я обычно ищу решения, соответствующие ISO 8601
EDIT
«Последовательный» в том смысле, что в идеале я бы сказал, скажем, решение, которое всегда использует as.numeric(dates)
с каким-то умным «объединением единиц времени» впоследствии.Но для месяцев я бы не увидел, как этого можно достичь, поскольку каждый месяц содержит разное количество дней (работает неделями, поскольку мы всегда можем с уверенностью сказать, что "неделя содержит 7 дней").
Другими словами: для месяцев Я бы хотел использовать что-то вроде (as.numeric(.x) / (<something>))
, как я использую (as.numeric(.x) / (60 * 60 * 24 * 7))
для недель .Это то, что <something>
, который я ищу, чтобы иметь общий способ разбивки различий в датах.
черновик решения
Функция defs:
library(magrittr)
library(purrr)
normalize_time_distance_month <- function(dates) {
dates %>%
as.POSIXct() %>%
purrr::map_dbl(function(.x)
as.numeric(format(.x, "%y")) * 12 + as.numeric(format(.x, "%m")))
}
normalize_time_distance_week <- function(dates) {
dates %>%
as.POSIXct() %>%
purrr::map_dbl(function(.x)
(as.numeric(.x) / (60 * 60 * 24 * 7)) %>%
round())
}
Месяцы:
# Months ------------------------------------------------------------------
dates <- seq(as.POSIXct("2018-03-01"), length.out = 24, by = "month")
origin <- as.POSIXct("2018-05-01")
dates_norm <- normalize_time_distance_month(dates)
origin_norm <- normalize_time_distance_month(origin)
(time_diffs <- dates_norm - origin_norm)
#> [1] -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
#> [24] 21
Недели:
# Weeks -------------------------------------------------------------------
dates <- seq(as.POSIXct("2018-05-07"), length.out = 104, by = "week")
origin <- as.POSIXct("2018-05-21")
dates_norm <- normalize_time_distance_week(dates)
origin_norm <- normalize_time_distance_week(origin)
(time_diffs <- dates_norm - origin_norm)
#> [1] -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
#> [18] 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
#> [35] 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
#> [52] 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
#> [69] 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
#> [86] 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
#> [103] 100 101
Создано в 2018-05-25 пакетом Представить (v0.2.0).