【问题标题】:Count the months between two dates in a data.table计算 data.table 中两个日期之间的月份
【发布时间】:2017-12-24 09:13:16
【问题描述】:

我有一个data.table,如下所示:

ID   start_date   end_date
1    2015.01.01   2016.02.01 
2    2015.06.01   2016.03.01
3    2016.01.01   2017.01.01

我想得到以下内容:

ID   start_date   end_date    Months_passed
1    2015.01.01   2016.02.01  13
2    2015.06.01   2016.03.01   9
3    2016.01.01   2017.01.01  12

我正在尝试以下代码:

DT[, Months_passed:= length(seq(from = start_date, to = end_date, by='month')) - 1]

但是我得到了错误,那个

“seq.Date 中的错误(从 = start_date,to = end_date,by = “month”): 'from' 的长度必须为 1"

【问题讨论】:

  • 你试过difftime吗?
  • 可以,但是 difftime 的最大单位是“周”:/
  • 所以除以 4...
  • 或来自 lubridate 的 time_length(period,unit="months")
  • 样本数据集中的所有start_dateend_date 都是第一天。个月。如果日期不是第一天,您如何计算月份?例如,2015-01-24 到 2015-02-07 期间可以算作 2 个月(1 月和 2 月)还是 0.5 个月(14 天)?

标签: r data.table datediff


【解决方案1】:

这是使用 data.table 的一种可能方法。首先,将您的日期转换为真正的日期格式:

df[, 2:3 := lapply(.SD, as.IDate, format = "%Y.%m.%d"), .SDcols = 2:3]

然后,获取过去的月份:

df[, months_passed := lengths(Map(seq, start_date, end_date, by = "months")) -1]

所以基本上你需要Map开始和结束日期seq

结果是:

df
#   ID start_date   end_date months_passed
#1:  1 2015-01-01 2016-02-01            13
#2:  2 2015-06-01 2016-03-01             9
#3:  3 2016-01-01 2017-01-01            12

【讨论】:

    猜你喜欢
    • 2022-11-18
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多