Можем ли мы извлечь номера недели из даты - PullRequest
3 голосов
/ 08 октября 2019

У меня есть датафрейм df. Есть ли способ заполнить номера недель (как показано во втором столбце в кадре данных). Я имею в виду цифры недели должны быть непрерывными. Например.

df <- structure(list(Date = structure(c(1527120000, 1527206400, 1527292800, 
1527379200, 1527465600, 1527552000, 1527638400, 1527724800, 1527811200, 
1527897600, 1527984000, 1528070400, 1528156800, 1528243200, 1528329600, 
1528416000, 1528502400, 1528588800, 1528675200, 1528761600, 1528848000, 
1528934400, 1529020800, 1529107200, 1529193600, 1529280000, 1529366400, 
1529452800, 1529539200, 1529625600, 1529712000, 1529798400, 1529884800, 
1529971200, 1530057600, 1530144000), class = c("POSIXct", "POSIXt"
), tzone = "UTC"), Week = c(1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 
2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 
5, 5, 5, 6)), row.names = c(NA, -36L), class = c("tbl_df", "tbl", 
"data.frame"))

Здесь первая дата 24-05-2018, и поэтому она должна быть пронумерована как 1. Число должно быть продолжено в течение следующих 6 дней, а затем 2 должно начаться в течение следующих 7 дней. Через 4 недели номер не должен быть снова 1, номер должен быть пронумерован как 5 и так далее. В общем, мне нужно проверить среднее значение временного ряда за 4 года. Таким образом, с первого дня (скажем, в 2000 году) до последнего дня (скажем, в 2014 году) должен быть указан номер недели. Есть ли способ?

Ответы [ 4 ]

2 голосов
/ 08 октября 2019

Значения даты - это количество секунд с определенной даты. Здесь мы можем вычислить недельное смещение по модулю математики

df %>% 
  mutate(NewWeek = as.numeric(Date-min(Date)) %/% (60*60*24*7) + 1)

. Вычитаем первую дату и видим, сколько семидневных периодов прошло.

2 голосов
/ 08 октября 2019

Вы можете использовать lubridate:

library(lubridate)
df$Data <- trunc((ymd(df$Date) - min(ymd(df$Date)))/dweeks(1)) + 1

1 необходимо, чтобы начать нумерацию недель с 1. trunc избавляет от десятичных знаков.

2 голосов
/ 08 октября 2019

Мы можем использовать gl

library(dplyr)
df %>% 
   mutate(Week = as.integer(gl(n(), 7, n())))
1 голос
/ 08 октября 2019

Вы также можете попробовать:

df %>%
 mutate(Week = ceiling(row_number()/7))

   Date                 Week
   <dttm>              <dbl>
 1 2018-05-24 00:00:00     1
 2 2018-05-25 00:00:00     1
 3 2018-05-26 00:00:00     1
 4 2018-05-27 00:00:00     1
 5 2018-05-28 00:00:00     1
 6 2018-05-29 00:00:00     1
 7 2018-05-30 00:00:00     1
 8 2018-05-31 00:00:00     2
 9 2018-06-01 00:00:00     2
10 2018-06-02 00:00:00     2

Он не учитывает даты, он просто группирует каждые 7 строк.

То же самое с base R:

ceiling(1:NROW(df)/7)

 [1] 1 1 1 1 1 1 1 2 2 2 2 2 2 2 3 3 3 3 3 3 3 4 4 4 4 4 4 4 5 5 5 5 5 5 5 6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...