Я хочу создать функцию для создания даты и часа на основе первой даты месяца. В качестве образца я использую сентябрь.

first_datex <- "2021-09-01"
gen_month <- function(first_datex){
# Need solution
}

Результат, который я хочу, выглядит следующим образом:

library(lubridate)
gen_date <- seq(ymd_h("2021-09-01-00"), ymd_h("2021-09-30-23"), by = "hours")
hourx <- hour(gen_date)
datex <- date(gen_date)
mydata <- data.frame(datex, hourx)

head(mydata) #The Output
#       datex hourx
#1 2021-09-01     0
#2 2021-09-01     1
#3 2021-09-01     2
#4 2021-09-01     3
#5 2021-09-01     4
#6 2021-09-01     5
0
Faryan 9 Окт 2021 в 06:33

2 ответа

Лучший ответ

Вот вариант -

gen_month <- function(first_datex){
  first_datex <- as.Date(first_datex)
  last_datex <- seq(first_datex, length = 2, by = 'month')[2] - 1
  expand.grid(datex = seq(first_datex, last_datex, by = 'day'), 
              hourx = 0:23)
}

gen_month("2021-09-01")

Другой вариант с использованием lubridate::ceiling_date и tidyr::expand_grid.

gen_month <- function(first_datex){
  first_datex <- as.Date(first_datex)
  last_datex <- lubridate::ceiling_date(first_datex, 'month') - 1
  tidyr::expand_grid(datex = seq(first_datex, last_datex, by = 'day'), 
              hourx = 0:23)
}
0
Ronak Shah 9 Окт 2021 в 03:43
library(lubridate)

first_datex <- "2021-09-01-00"

gen_month <- function(first){
  
  end <- ymd_h(first_datex) + months(1) - hours(1)
  gen_date <- seq(ymd_h(first), end, by = "hours")
  data.frame(date(gen_date),hour(gen_date))
  
}

Тогда вы можете просто запустить:

gen_month(first_datex)

Вы можете проверить функцию с помощью:

identical(mydata, gen_month(first_datex)

Что дает TRUE

0
Matt 9 Окт 2021 в 03:49