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'
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top