如何按月装箱日期

How to bin date by month

我有以下数据:

  df <- data.frame(dt1 = c("2019-05-02", "2019-01-02", "2019-06-02"), 
                   dt2 =   c("2019-08-30", "2019-04-24", "2019-12-06") )
> df
         dt1        dt2
1 2019-05-02 2019-08-30
2 2019-01-02 2019-04-24
3 2019-06-02 2019-12-06

这是我想要做的:

i) 我想通过分箱来创建因子,例如,对于第一个日期,日期分箱为 2019-07-31、2019-06-30、2019-05-31,因此本质上是按 dt2 分箱。
ii) 我想计算每个 bin 中的日期总数。

预期输出为:

        dt1        dt2      val_count
1 2019-05-02 2019-08-30         3
2 2019-01-02 2019-04-24         3 
3 2019-06-02 2019-12-06         6 

我发现这个 相关。

注意:我不想计算两个日期的月份。

感谢您的建议。

这很乱,但是如果你想计算在 dt1dt2 之间有多少个月的最后日期,你可以尝试

library(lubridate)
library(dplyr)

fd <- paste0(lubridate::year(min(df$dt1, df$dt2)), "-02-01") %>% as.Date()

ld <- paste0(lubridate::year(max(df$dt1, df$dt2))+1, "-01-01") %>% as.Date()
x <- seq.Date(fd, ld, by = "month") - 1
df %>%
  rowwise() %>%
  mutate(val_count = length(x[dt1 < x & x < dt2]))

  dt1        dt2        val_count
  <chr>      <chr>          <int>
1 2019-05-02 2019-08-30         3
2 2019-01-02 2019-04-24         3
3 2019-06-02 2019-12-06         6

选择 <<= 取决于您的目的。

获取 dt1dt2 之间的总天数,

df %>%
  rowwise() %>%
  mutate(val_count = length(x[dt1 < x & x < dt2])) %>%
  mutate(dd = as.Date(dt2) - as.Date(dt1))

  dt1        dt2        val_count dd      
  <chr>      <chr>          <int> <drtn>  
1 2019-05-02 2019-08-30         3 120 days
2 2019-01-02 2019-04-24         3 112 days
3 2019-06-02 2019-12-06         6 187 days

添加

df %>%
  rowwise() %>%
  mutate(val_count = length(x[dt1 < x & x < dt2]),
         val_count = ifelse(val_count == 0, 1, val_count)) %>%
  mutate(dd = as.Date(dt2) - as.Date(dt1))

  dt1        dt2        val_count dd      
  <chr>      <chr>          <dbl> <drtn>  
1 2019-05-02 2019-08-30         3 120 days
2 2019-01-02 2019-04-24         3 112 days
3 2019-06-02 2019-12-06         6 187 days
4 2019-06-01 2019-06-02         1   1 days

上面的解决方案确实有点乱,只需要一个简单的 oneliner 就可以做到这一点

df <- data.frame(dt1 = c("2019-05-02", "2019-01-02", "2019-06-02", "2019-06-01"), dt2 =   c("2019-08-30", "2019-04-24", "2019-12-06", "2019-06-02") )

df %>%
  mutate(val_count = as.period(ymd(dt2) - ymd(dt1)) %/% months(1))

#          dt1        dt2 val_count
# 1 2019-05-02 2019-08-30         3
# 2 2019-01-02 2019-04-24         3
# 3 2019-06-02 2019-12-06         6
# 4 2019-06-01 2019-06-02         0