Generieren Sie eine Folge des letzten Tages des Monats über zwei Jahre
Frage
Ich benutze Lubrate und stellte fest, dass dies so einfach wäre
ymd("2010-01-31")+months(0:23)
Aber schau was man bekommt. Es ist alles durcheinander!
[1] "2010-01-31 UTC" "2010-03-03 UTC" "2010-03-31 UTC" "2010-05-01 UTC" "2010-05-31 UTC" "2010-07-01 UTC" "2010-07-31 UTC" "2010-08-31 UTC" "2010-10-01 UTC"
[10] "2010-10-31 UTC" "2010-12-01 UTC" "2010-12-31 UTC" "2011-01-31 UTC" "2011-03-03 UTC" "2011-03-31 UTC" "2011-05-01 UTC" "2011-05-31 UTC" "2011-07-01 UTC"
[19] "2011-07-31 UTC" "2011-08-31 UTC" "2011-10-01 UTC" "2011-10-31 UTC" "2011-12-01 UTC" "2011-12-31 UTC"
Dann las ich, wie Lubrate das Phänomen wie Intervall, Dauer und Periode kostet. OK, ich merke, dass ein Monat tatsächlich die Anzahl der Tage ist, die durch (365*4+1)/48 = 30,438 Tage definiert sind. Also habe ich versucht, klug zu werden und es neu zu schreiben
ymd("2010-01-31")+ as.period(months(0:23))
Aber das gab nur einen Fehler.
Error in as.period.default(months(0:23)) : (list) object cannot be coerced to type 'double'
Lösung
Ja, Sie haben den richtigen Trick gefunden: einen Tag vom ersten der nächsten Monat.
Hier ist ein Einzeiler in der Basis R:
R> seq(as.Date("2010-02-01"), length=24, by="1 month") - 1
[1] "2010-01-31" "2010-02-28" "2010-03-31" "2010-04-30" "2010-05-31"
[6] "2010-06-30" "2010-07-31" "2010-08-31" "2010-09-30" "2010-10-31"
[11] "2010-11-30" "2010-12-31" "2011-01-31" "2011-02-28" "2011-03-31"
[16] "2011-04-30" "2011-05-31" "2011-06-30" "2011-07-31" "2011-08-31"
[21] "2011-09-30" "2011-10-31" "2011-11-30" "2011-12-31"
R>
Also keine Notwendigkeit für Lubrate Was (während ein gutes Paket) für eine solche einfache Aufgabe nicht benötigt wird. Außerdem fällt mir die Überlastung bestehender Basisfunktionen immer noch als etwas gefährlich an ...
Andere Tipps
Es ist erstaunlich, wie das Tippen einer Frage die kreative Energie konzentriert. Ich glaube, ich habe die Antwort ausgearbeitet. Ich kann es auch hier für die nächste arme Seele posten, die Zeit verschwendet.
ymd("2010-02-01")+ months(0:23)-days(1)
Geben Sie einfach den ersten Tag des nächsten Monats an und generieren Sie eine Sequenz davon, subtrahieren Sie jedoch 1 Tage davon, um den letzten Tag des vorhergehenden Monats zu erhalten.
[1] "2010-01-31 UTC" "2010-02-28 UTC" "2010-03-31 UTC" "2010-04-30 UTC" "2010-05-31 UTC" "2010-06-30 UTC" "2010-07-31 UTC" "2010-08-31 UTC" "2010-09-30 UTC"
[10] "2010-10-31 UTC" "2010-11-30 UTC" "2010-12-31 UTC" "2011-01-31 UTC" "2011-02-28 UTC" "2011-03-31 UTC" "2011-04-30 UTC" "2011-05-31 UTC" "2011-06-30 UTC"
[19] "2011-07-31 UTC" "2011-08-31 UTC" "2011-09-30 UTC" "2011-10-31 UTC" "2011-11-30 UTC" "2011-12-31 UTC"
Übrigens, wie werde ich die lästigen "UTC" -Schiantungen loswerden? Zeitzonen sind ein Lebensretter, wenn sie benötigt werden. Die restlichen Zeit sind sie ein Ärgernis.