Как я могу создать последовательность строковых значений год-неделя на основе существующих дат? - PullRequest
2 голосов
/ 24 апреля 2019

Я строю еженедельные цифры, которые переходят с 2018 на 2019, а отметки на моей оси X представляют год, а затем неделю.

Например:

2018-50, 2018-51, 2018-52, 2018-53, 2019-01, 2019-02, 2019-03

У меня есть два фрейма данных, и даты в обоих не всегда будут одинаковыми. Таким образом, одно из решений, которое я подумал, может сработать, чтобы найти самое низкое значение yearWeek в любом фрейме данных и максимальное значение yearWeek в любом фрейме данных, а затем создать последовательность, используя эти два значения. Обратите внимание, что оба значения могут существовать в одном фрейме данных или один фрейм данных может иметь самое низкое / самое раннее значение, а другое - самое высокое / самое последнее значение.

Оба фрейма данных выглядят так:

  week yearWeek      month  day       date
1   31  2018-31 2018-08-01  Wed 2018-08-01
2   31  2018-31 2018-08-01  Thu 2018-08-02
3   31  2018-31 2018-08-01  Fri 2018-08-03
4   31  2018-31 2018-08-01  Sat 2018-08-04
5   32  2018-32 2018-08-01  Sun 2018-08-05
6   32  2018-32 2018-08-01  Mon 2018-08-06

Я искал решение, и этот ответ почти готов, но не совсем.

Проблемы с этим решением:

  • Номер недели, состоящий из одной цифры, не имеет 0 перед ними; и
  • Несмотря на указание, например, seq(31:53), вывод начинается с 1 (я знаю, почему это происходит); и
  • Похоже, что нет способа остановить счет на 53, используя этот метод (у 2018 была (короткая) 53-я неделя, которую я хотел бы включить) и возобновить с 2019-01 и далее.

Я хочу иметь возможность установить диапазон оси X от 2018-31 (31-я неделя 2018 года) до 2019-13 (13-я неделя 2019 года).

Примерно так:

enter image description here

Короче говоря, как я могу создать последовательность значений год-неделя в диапазоне от минимального значения даты до максимального значения даты (в данном случае 2018-31 - 2019-13)?

Ответы [ 4 ]

1 голос
/ 24 апреля 2019

Я думаю, что это будет работать для вас

x1 <- c(31:53)
x2 <- sprintf("%02d", c(1:13))
paste(c(rep(2018, length(x1)), rep(2019, length(x2))), c(x1, x2), sep = "-")

# [1] "2018-31" "2018-32" "2018-33" "2018-34" "2018-35" "2018-36" "2018-37" 
#     "2018-38" "2018-39" "2018-40" "2018-41" "2018-42" "2018-43" "2018-44" 
#     "2018-45" "2018-46" "2018-47" "2018-48" "2018-49" "2018-50" "2018-51" 
#     "2018-52" "2018-53" "2019-01" "2019-02" "2019-03" "2019-04" "2019-05" 
# "2019-06" "2019-07" "2019-08" "2019-09" "2019-10" "2019-11" "2019-12" "2019-13"

Для обновленного вопроса мы можем сделать

#rbind both the dataset
df <- rbind(df1, df2)

#convert them to date
df$Date <- as.Date(df$date)

#Generate a sequence from min date to maximum date, format them 
# to year-week combination and select only the unique ones
unique(format(seq(min(df$Date), max(df$Date), by = "day"), "%Y-%W"))
0 голосов
/ 24 апреля 2019

Вот возможность использования strftime:

weeks <- seq(from = ISOdate(2018,12,10), to = ISOdate(2019,4,1), by="week")
strftime(weeks,format="%Y-%W") 
0 голосов
/ 24 апреля 2019

здесь можно использовать функцию str_pad из пакета stringr:

weeks <- str_pad(41:65 %% 53 + 1, 2, "left", "0")
years <- ifelse(41:65 <= 52, "2018", "2019")
paste(years, weeks, sep = "-")
     [1] "2018-42" "2018-43" "2018-44" "2018-45" "2018-46" "2018-47" "2018-48" "2018-49" "2018-50" "2018-51" "2018-52" "2018-53" "2019-01" "2019-02" "2019-03" "2019-04" "2019-05" "2019-06" "2019-07" "2019-08" "2019-09"
[22] "2019-10" "2019-11" "2019-12" "2019-13"

Как я только что узнал из двух других ответов sprintf предоставляет базовую альтернативу str_pad. Так что вы также можете использовать

weeks <- sprintf("%02d", 41:65 %% 53 + 1)
0 голосов
/ 24 апреля 2019

Определите две последовательности, а затем ограничитесь желаемым диапазоном:

years <- c("2018", "2019")
months <- sprintf("%02d", c(1:52))

result <- apply(expand.grid(years, months), 1, function(x) paste(x,collapse="-"))
result <- result[result >= "2018-31" & result <= "2019-13"]
result

 [1] "2019-01" "2019-02" "2019-03" "2019-04" "2019-05" "2019-06" "2019-07"
 [8] "2019-08" "2019-09" "2019-10" "2019-11" "2019-12" "2019-13" "2018-31"
[15] "2018-32" "2018-33" "2018-34" "2018-35" "2018-36" "2018-37" "2018-38"
[22] "2018-39" "2018-40" "2018-41" "2018-42" "2018-43" "2018-44" "2018-45"
[29] "2018-46" "2018-47" "2018-48" "2018-49" "2018-50" "2018-51" "2018-52"

Обратите внимание, что отсечение дат, которые нам не нужны, работает здесь даже с использованием текстовых строк дат, поскольку все даты фиксированыСтроки ширины и оставляют дополненными нулями, если необходимо.Таким образом, сортировка работает так же, как и для фактических чисел.

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