如何从任意日期开始分配年份中的天数值并照顾缺失的数值?

时间:2019-01-18 12:47:37

标签: r date dataframe

我有一个带有日期列df_demand和因变量列(depdate)的R数据帧bookings。持续时间为365天,从2017-11-02开始至2018-11-01,以升序排列。

We have booking data for only 279 days in the year.

dplyr::arrange(df_demand, depdate)

           depdate bookings
    1   2017-11-02       43
    2   2017-11-03       27
    3   2017-11-05       27
    4   2017-11-06       22
    5   2017-11-07       39
    6   2017-11-08       48
    .
    .

   279  2018-11-01       60

我想通过以下方式介绍另一列day_of_year:

    depdate       day_of_year     bookings
1    2017-11-02        1              43
2    2017-11-03        2              27
3    2017-11-04        3              NA
4    2017-11-05        4              27
    .
    .
    .
365  2018-11-01      365              60

我正在尝试找到最佳方法。

在Python中,我可以使用类似的东西:

df_demand['day_of_year'] = df_demand['depdate'].sub(df_demand['depdate'].iat[0]).dt.days + 1

我想知道同样的R equivalent

我跑步时

typeof(df_demand_2$depdate)

输出为

"double"

我想念什么吗?

enter image description here

1 个答案:

答案 0 :(得分:2)

您可以使用complete包中的tidyr函数为每个日期创建一行。

首先,我用一些示例数据创建一个数据框:

df <- data.frame(
  depdate = as.Date(c('2017-11-02', '2017-11-03', '2017-11-05')),
  bookings = c(43, 27, 27)
)

接下来,我要执行两项操作。首先,使用tidyr::complete,指定要在分析中使用的所有日期。我可以使用seq.Date来做到这一点,创建从第一天到最后一天的序列。

完成后,day_of_year列就等于行号。

df_complete <- tidyr::complete(df,
  depdate = seq.Date(from = min(df$depdate), to = max(df$depdate), by = 1)
)

df_complete$day_of_year <- 1:nrow(df_complete)

> df_complete
#> # A tibble: 4 x 3
#>   depdate    bookings day_of_year
#>   <date>        <dbl>       <int>
#> 1 2017-11-02       43           1
#> 2 2017-11-03       27           2
#> 3 2017-11-04       NA           3
#> 4 2017-11-05       27           4

dplyr中的管道运算符等效的解决方案:

df %>%
  complete(depdate = seq.Date(from = min(df$depdate), to = max(df$depdate), by = 1)) %>%
  mutate(days_of_year = row_number())