是否有标准/通用方法/公式来计算R中两个日期之间的月数?
相似的东西答案 0 :(得分:54)
我正要说这很简单,但difftime()
会在几周内停止。有多奇怪
所以一个可能的答案就是黑客攻击:
# turn a date into a 'monthnumber' relative to an origin
R> monnb <- function(d) { lt <- as.POSIXlt(as.Date(d, origin="1900-01-01")); \
lt$year*12 + lt$mon }
# compute a month difference as a difference between two monnb's
R> mondf <- function(d1, d2) { monnb(d2) - monnb(d1) }
# take it for a spin
R> mondf(as.Date("2008-01-01"), Sys.Date())
[1] 24
R>
似乎是正确的。可以将它包装成一些简单的类结构。或者把它留作黑客:)
编辑:似乎也可以使用Mathworks中的示例:
R> mondf("2000-05-31", "2000-06-30")
[1] 1
R> mondf(c("2002-03-31", "2002-04-30", "2002-05-31"), "2002-06-30")
[1] 3 2 1
R>
添加EndOfMonth
标志作为练习留给读者:)
编辑2:也许difftime
将其遗漏,因为没有可靠的方法来表示与其他单位的difftime
行为一致的小数差异。
答案 1 :(得分:41)
一个简单的功能......
elapsed_months <- function(end_date, start_date) {
ed <- as.POSIXlt(end_date)
sd <- as.POSIXlt(start_date)
12 * (ed$year - sd$year) + (ed$mon - sd$mon)
}
示例...
>Sys.time()
[1] "2014-10-29 15:45:44 CDT"
>elapsed_months(Sys.time(), as.Date("2012-07-15"))
[1] 27
>elapsed_months("2002-06-30", c("2002-03-31", "2002-04-30", "2002-05-31"))
[1] 3 2 1
对我而言,将此问题视为简单地减去两个日期是有意义的,自minuend − subtrahend = difference
(wikipedia)起,我将后一个日期放在参数列表中。
请注意,它适用于1900年之前的日期,尽管这些日期内部表示年份为负数,这要归功于减去负数的规则......
> elapsed_months("1791-01-10", "1776-07-01")
[1] 174
答案 2 :(得分:34)
可能有一种更简单的方法。它不是一个功能,但只有一行。
length(seq(from=date1, to=date2, by='month')) - 1
e.g。
> length(seq(from=Sys.Date(), to=as.Date("2020-12-31"), by='month')) - 1
产地:
[1] 69
计算两个日期之间的整月数。如果要包含不是整月的当前月份/余数,请删除-1。
答案 3 :(得分:31)
我认为这是对与MathWorks函数奇偶校验提出的问题的更接近的答案
MathWorks月份功能
border
我的R代码
outline
输出(如代码于2016年4月运行时)
:focus
Lubridate [package] 提供了一些工具,可以更轻松地解析和操作日期。这些工具按以下目的分组。有关每个功能的更多信息,请参阅其帮助文档。
interval {lubridate} 创建一个具有指定开始日期和结束日期的Interval类对象。如果开始日期发生在结束日期之前,则间隔将为正。否则,它将是负面的
今天{lubridate} 当前日期
月 {基本} 提取月份这些是通用函数:此处记录了内部日期时间类的方法。
%/%{base} 表示整数除法AKA(x%/%y)(最多为舍入误差)
答案 4 :(得分:12)
在R-Help邮件列表中有一条与您相同的消息(之前我提到过CRAN列表)。
这里the link。有两种建议的解决方案:
#test data d1 <- as.Date("01 March 1950", "%d %B %Y") d2 <- as.Date(c("01 April 1955", "01 July 1980"), "%d %B %Y") # calculation round((d2 - d1)/(365.25/12))
seq.Dates
的长度如下:as.Date.numeric <- function(x) structure(floor(x+.001), class = "Date") sapply(d2, function(d2) length(seq(d1, as.Date(d2), by = "month")))-1
答案 5 :(得分:5)
library(lubridate)
案例1:天真的功能
mos<-function (begin, end) {
mos1<-as.period(interval(ymd(begin),ymd(end)))
mos<-mos1@year*12+mos1@month
mos
}
案例2:如果您需要仅考虑'月'而不考虑'日'
mob<-function (begin, end) {
begin<-paste(substr(begin,1,6),"01",sep="")
end<-paste(substr(end,1,6),"01",sep="")
mob1<-as.period(interval(ymd(begin),ymd(end)))
mob<-mob1@year*12+mob1@month
mob
}
示例:
mos(20150101,20150228) # 1
mos(20150131,20150228) # 0
# you can use "20150101" instead of 20150101
mob(20150131,20150228) # 1
mob(20150131,20150228) # 1
# you can use a format of "20150101", 20150101, 201501
答案 6 :(得分:4)
library(lubridate)
date1 = "1 April 1977"
date2 = "7 July 2017"
date1 = dmy(date1)
date2 = dmy(date2)
number_of_months = (year(date1) - year(date2)) * 12 + month(date1) - month(date2)
月份差异= 12 *年份差异+月份差异。
可能需要使用
ifelse
条件更正以下内容 减去月份
答案 7 :(得分:1)
您可以在R base中使用as.yearmon()函数。此函数将Date类型变量转换为Year-month类型变量。您可以减去两个年月类型变量,然后乘以12以得到月份的差异,如下所示:
12 * (as.yearmon(Date1) - as.yearmon(Date2))
答案 8 :(得分:0)
日期差(月)
$date1 = '2017-01-20';
$date2 = '2019-01-20';
$ts1 = strtotime($date1);
$ts2 = strtotime($date2);
$year1 = date('Y', $ts1);
$year2 = date('Y', $ts2);
$month1 = date('m', $ts1);
$month2 = date('m', $ts2);
echo $joining_months = (($year2 - $year1) * 12) + ($month2 - $month1);
答案 9 :(得分:0)
对我来说这是可行的:
library(lubridate)
Pagos$Datediff <- (interval((Pagos$Inicio_FechaAlta), (Pagos$Inicio_CobFecha)) %/% months(1))
输出是两个日期之间的月数,并存储在Pagos数据框的一列中。
答案 10 :(得分:0)
另一种简便的方法是
day1 <- as.Date('1991/04/12')
day2 <- as.Date('2019/06/10')
round(as.numeric(day2 - day1)/30.42)
[1] 338