计算 data.table 中两个日期之间的月份
Count the months between two dates in a data.table
我有一个 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]
但是我得到了错误,
"Error in seq.Date(from = start_date, to = end_date, by = "month") :
'from' must be of length 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
我有一个 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]
但是我得到了错误,
"Error in seq.Date(from = start_date, to = end_date, by = "month") : 'from' must be of length 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