是否有标准/通用方法/公式来计算R中两个日期之间的月数?
我正在寻找类似于MathWorks月功能的东西
是否有标准/通用方法/公式来计算R中两个日期之间的月数?
我正在寻找类似于MathWorks月功能的东西
Answers:
我只是说这很简单,但要等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>
似乎正确。可以将其包装到一些简单的类结构中。或将其作为hack :)
编辑:似乎也与您的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
其他单位的行为是一致的。
difftime()
函数。俗话说“没有免费的午餐” :)
as.numeric()
,而“12”与第二个答案我的回答给了“14”作为一个希望。
一个简单的功能...
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
我认为这是对与MathWorks函数奇偶性有关的问题的较接近答案
MathWorks月功能
MyMonths = months(StartDate, EndDate, EndMonthFlag)
我的R代码
library(lubridate)
interval(mdy(10012015), today()) %/% months(1)
输出(如代码在2016年4月运行时)
[1] 6
Lubridate [package]提供的工具使解析和操作日期变得更加容易。这些工具按通用目的分类在下面。有关每个功能的更多信息,请参见其帮助文档。
interval {lubridate}创建一个具有指定开始日期和结束日期的Interval-class对象。如果开始日期早于结束日期,则间隔为正。否则将为负
今天{lubridate}当前日期
months {Base}提取month这些是通用功能:内部日期时间类的方法在此处记录。
%/%{base}表示整数除法AKA(x%/%y)(最大舍入误差)
可能有一种更简单的方法。它不是一个函数,但仅一行。
length(seq(from=date1, to=date2, by='month')) - 1
例如
> length(seq(from=Sys.Date(), to=as.Date("2020-12-31"), by='month')) - 1
产生:
[1] 69
这将计算两个日期之间的整个月数。如果要包括当前月份/非整个月的余数,请删除-1。
length(seq(from=as.Date("2015-01-31"), to=as.Date("2015-03-31"), by='month')) = 3
此外, length(seq(from=as.Date("2015-01-31"), to=as.Date("2015-04-30"), by='month')) = 3
R-Help邮件列表中有一条与您一样的消息(以前我提到过CRAN列表)。
这里的链接。有两种建议的解决方案:
#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
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
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
月份减去的条件进行校正
abs(etc)
。我认为这是一个非常简单,直接的解决方案,只需花guestimate
几个月的时间
对我来说,这是有效的:
library(lubridate)
Pagos$Datediff <- (interval((Pagos$Inicio_FechaAlta), (Pagos$Inicio_CobFecha)) %/% months(1))
输出是两个日期之间的月数,并存储在Pagos数据框的列中。
您可以从zoo包中使用as.yearmon()函数。此函数将Date类型变量转换为Year-month类型变量。您可以减去两个Year-month类型变量,然后乘以12以得到月份的差异,如下所示:
12 * (as.yearmon(Date1) - as.yearmon(Date2))
as.yearmon()
是zoo
包的一部分,而不是R base的一部分。如果您安装了动物园:12 * (zoo::as.yearmon(Date1) - zoo::as.yearmon(Date2))
日期差异(以月为单位)
$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);