2012-02-29 9 views
13

Mam dużą ramkę danych [r] ze zmiennymi daty, które odzwierciedlają pierwszy dzień miesiąca. Czy w prosty sposób można utworzyć nową zmienną daty w ramce danych, która reprezentuje ostatni dzień miesiąca?Metoda tworzenia daty końca miesiąca ze zmiennej daty w ramce danych [r]

Poniżej znajdują się przykładowe dane:

date.start.month=seq(as.Date("2012-01-01"),length=4,by="months") 
df=data.frame(date.start.month) 
df$date.start.month 

"2012-01-01" "2012-02-01" "2012-03-01" "2012-04-01" 

Chciałbym powrócić nową zmienną wtih:

"2012-01-31" "2012-02-29" "2012-03-30" "2012-04-27" 

Próbowałem follwing ale było unsucessful:

df$date.end.month=seq(df$date.start.month,length=1,by="+1 months") 

Wszelkie wskazówki dla nowego użytkownika [r] byłyby bardzo mile widziane.

+0

Twój przykładowy wynik nie pasuje do pytania. – James

+1

Można również rozważyć użycie klasy '" yearmon "', która reprezentuje rok/miesiąc bez potrzeby spędzania pierwszego dnia: 'library (zoo); ym <- as.yearmon ("2012-01") + 0: 3/12'. Jeśli chcesz dat w ostatnim dniu miesiąca, to 'as.Date (ym, frac = 1)'. –

+0

G.Grothendieck: Dziękuję za sugestię, będę pamiętać, aby użyć klasy yearmon dla tego typu danych daty w przyszłości. – MikeTP

Odpowiedz

15

Aby uzyskać koniec miesięcy, wystarczy utworzyć wektor Date zawierający pierwszy ze wszystkich kolejnych miesięcy i odjąć 1 dzień.

date.end.month <- seq(as.Date("2012-02-01"),length=4,by="months")-1 
date.end.month 
[1] "2012-01-31" "2012-02-29" "2012-03-31" "2012-04-30" 
+0

Dzięki James, ale to nie działa w strukturze ramek danych. – MikeTP

+0

biblioteka (lubridate) data.start.month = seq (as.Date ("2012-01-01"), długość = 4, przez = "miesiące") df = data.frame (data.start.month) df $ date.end.month = df $ date.start.month + miesięcy (1) -days (1) df $ date.start.month df $ date.end.month „2012-01 -01 "" 2012-02-01 "" 2012-03-01 "" 2012-04-01 " " 2012-01-31 "" 2012-02-29 "" 2012-03-31 "" 2012-04 -30 " – MikeTP

+0

@MikeTP Wygląda na to, że działa dla mnie, ale twój przykładowy wynik był niezrozumiały: dlaczego 27 kwietnia? – James

6

Zastosowanie timeLastDayInMonth z pakietu timeDate:

df$eom<-timeLastDayInMonth(df$somedate) 
1

Funkcja poniżej zrobi pracę (zakładamy dt jest skalarne) -

month_end <- function(dt) { 
    d <- seq(dt, dt+31, by="days") 
    max(d[format(d,"%m")==format(dt,"%m")]) 
} 

Jeśli masz wektor dat , wykonaj następujące czynności:

sapply(dates, month_end) 
4

Oto kolejny rozwiązanie przy użyciu pakietu lubridate:

date.start.month=seq(as.Date("2012-01-01"),length=4,by="months") 
df=data.frame(date.start.month) 

library(lubridate) 
df$date.end.month <- ceiling_date(df$date.start.month, "month") - days(1) 
df$date.end.month 
[1] "2012-01-31" "2012-02-29" "2012-03-31" "2012-04-30" 

ta wykorzystuje tę samą koncepcję podane przez Jakuba powyżej, że dostaje od pierwszego dnia następnego miesiąca i odejmuje jeden dzień.

Nawiasem mówiąc, będzie to działać nawet wtedy, gdy data wprowadzenia niekoniecznie będzie pierwszym dniem miesiąca. Na przykład dzisiaj jest 27 dnia miesiąca i nadal zwraca prawidłowy ostatni dzień miesiąca:

ceiling_date(Sys.Date(), "month") - days(1) 
[1] "2017-07-31" 
Powiązane problemy