Gibt es eine Standard- / gemeinsame Methode / Formel zur Berechnung der Anzahl der Monate zwischen zwei Daten in R?
Ich suche etwas, das der MathWorks-Monatsfunktion ähnelt
Gibt es eine Standard- / gemeinsame Methode / Formel zur Berechnung der Anzahl der Monate zwischen zwei Daten in R?
Ich suche etwas, das der MathWorks-Monatsfunktion ähnelt
Antworten:
Ich wollte gerade sagen, dass das einfach ist,
difftime()
hört aber nach Wochen auf. Wie seltsam.Eine mögliche Antwort wäre also, etwas zu hacken:
# 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>
Scheint ungefähr richtig. Man könnte dies in eine einfache Klassenstruktur einwickeln. Oder lass es als Hack :)
Bearbeiten: Scheint auch mit Ihren Beispielen aus dem Mathworks zu funktionieren:
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>
Das Hinzufügen der
EndOfMonth
Flagge bleibt dem Leser als Übung überlassen :)Bearbeiten 2: Lässt
difftime
es möglicherweise weg, da es keine zuverlässige Möglichkeit gibt, Bruchdifferenzen auszudrücken, die mit demdifftime
Verhalten für andere Einheiten übereinstimmen würden .quelle
difftime()
Funktion aufzurufen . "No Free Lunch" wie das Sprichwort sagt :)as.numeric()
, und '12' mit der zweiten Antwort. Meine Antwort gibt '14', wie man möchte.Eine einfache Funktion ...
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) }
Beispiel...
>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
Für mich ist es sinnvoll, dieses Problem als einfaches Subtrahieren von zwei Daten zu betrachten, und da
minuend − subtrahend = difference
(Wikipedia) habe ich das spätere Datum zuerst in die Parameterliste aufgenommen.Beachten Sie, dass es für Daten vor 1900 gut funktioniert, obwohl diese Daten interne Darstellungen des Jahres als negativ aufweisen, dank der Regeln zum Subtrahieren negativer Zahlen ...
> elapsed_months("1791-01-10", "1776-07-01") [1] 174
quelle
Ich denke, dies ist eine genauere Antwort auf die Frage, die in Bezug auf die Parität mit der MathWorks-Funktion gestellt wird
MathWorks Monatsfunktion
Mein R-Code
library(lubridate) interval(mdy(10012015), today()) %/% months(1)
Ausgabe (als der Code im April 2016 ausgeführt wurde)
[1] 6
Lubridate [Paket] bietet Tools, mit denen Datumsangaben einfacher analysiert und bearbeitet werden können . Diese Tools sind nachstehend nach allgemeinem Zweck zusammengefasst. Weitere Informationen zu den einzelnen Funktionen finden Sie in der Hilfedokumentation.
intervall {lubridate} erstellt ein Intervallklassenobjekt mit den angegebenen Start- und Enddaten . Wenn das Startdatum vor dem Enddatum liegt, ist das Intervall positiv. Andernfalls wird es negativ sein
today {lubridate} Das aktuelle Datum
Monate {Basis} Monat extrahieren Dies sind allgemeine Funktionen: Die Methoden für die internen Datums- / Zeitklassen werden hier dokumentiert.
% /% {base} gibt die Ganzzahldivision AKA (x% /% y) an (bis zum Rundungsfehler)
quelle
Es kann einen einfacheren Weg geben. Es ist keine Funktion, sondern nur eine Zeile.
length(seq(from=date1, to=date2, by='month')) - 1
z.B
> length(seq(from=Sys.Date(), to=as.Date("2020-12-31"), by='month')) - 1
Produziert:
[1] 69
Dies berechnet die Anzahl ganzer Monate zwischen den beiden Daten. Entfernen Sie die -1, wenn Sie den aktuellen Monat / Rest einschließen möchten, der kein ganzer Monat ist.
quelle
length(seq(from=as.Date("2015-01-31"), to=as.Date("2015-03-31"), by='month')) = 3
Auchlength(seq(from=as.Date("2015-01-31"), to=as.Date("2015-04-30"), by='month')) = 3
In der R-Help-Mailingliste befindet sich eine Nachricht wie Ihre (zuvor habe ich eine CRAN-Liste erwähnt).
Hier der Link . Es gibt zwei Lösungsvorschläge:
seq.Dates
wie folgt zu ermitteln :quelle
case1: naive Funktion
mos<-function (begin, end) { mos1<-as.period(interval(ymd(begin),ymd(end))) mos<-mos1@year*12+mos1@month mos }
Fall 2: Wenn Sie unabhängig von "Tag" nur "Monat" berücksichtigen müssen
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 }
Beispiel:
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
quelle
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)
quelle
abs(etc)
. Ich denke, dies ist eine sehr einfache und unkomplizierte Lösung, um einguestimate
Für mich hat das funktioniert:
library(lubridate) Pagos$Datediff <- (interval((Pagos$Inicio_FechaAlta), (Pagos$Inicio_CobFecha)) %/% months(1))
Die Ausgabe ist die Anzahl der Monate zwischen zwei Daten, die in einer Spalte des Pagos-Datenrahmens gespeichert sind.
quelle
Sie können die Funktion as.yearmon () aus dem Zoo-Paket verwenden. Diese Funktion konvertiert eine Variable vom Typ Datum in eine Variable vom Typ Jahr-Monat. Sie können zwei Variablen vom Typ Jahr-Monat subtrahieren und dann mit 12 multiplizieren, um die Differenz in Monaten wie folgt zu erhalten:
quelle
as.yearmon()
ist jedoch Teil deszoo
Pakets und nicht Teil der R-Basis. Wenn Sie einen Zoo installiert haben:12 * (zoo::as.yearmon(Date1) - zoo::as.yearmon(Date2))
Datumsunterschied in Monaten
$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);
quelle
Ein weiterer kurzer und bequemer Weg ist folgender:
day1 <- as.Date('1991/04/12') day2 <- as.Date('2019/06/10') round(as.numeric(day2 - day1)/30.42)
[1] 338
quelle