Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 计算data.table中两个日期之间的月份_R_Data.table_Datediff - Fatal编程技术网

R 计算data.table中两个日期之间的月份

R 计算data.table中两个日期之间的月份,r,data.table,datediff,R,Data.table,Datediff,我有一个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

我有一个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
我想得到以下信息:

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.Datefrom=开始日期,to=结束日期,by=月份时出错: “from”的长度必须为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]
所以基本上你需要把开始和结束日期映射到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的可能方法。首先,将日期转换为真实日期格式:

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]
所以基本上你需要把开始和结束日期映射到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

您尝试过difftime吗?是的,但difftime的最大单位是周:/So除以4…或time\u lengthperiod,单位=lubridate后的月数?示例数据集中的所有开始日期和结束日期都是响应的第一天。月。如果日期不是第一天,你如何计算月份?例如,从2015-01-24到2015-02-07这段时间可以计算为2个月1月和2月,或0.5个月14天?您是否尝试过difftime?是的,但difftime的最大单位是周:/So除以4…或time_lengthperiod,单位=lubridate的月数?样本数据集中的所有开始日期和结束日期都是响应的第一天。月。如果日期不是第一天,你如何计算月份?例如,从2015-01-24到2015-02-07这段时间可以算作1月和2月的2个月,或者算作14天的0.5个月?