2012-02-29 37 views
13

Tôi có khung dữ liệu lớn [r] có biến ngày, phản ánh ngày đầu tiên của tháng. Có phải cách dễ dàng để bỏ qua biến ngày khung dữ liệu mới đại diện cho ngày cuối cùng của tháng không?Phương pháp tạo ngày kết thúc tháng từ biến ngày trong khung dữ liệu [r]

Dưới đây là một số dữ liệu mẫu:

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" 

Tôi muốn trả lại một wtih biến mới:

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

Tôi đã thử follwing nhưng nó đã được unsucessful:

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

Bất kỳ hướng dẫn nào cho người dùng mới này sẽ được đánh giá cao.

+0

Kết quả ví dụ của bạn không phù hợp với câu hỏi. – James

+1

Bạn cũng có thể xem xét sử dụng lớp '" yearmon "' đại diện cho năm/tháng mà không cần một ngày ở nơi đầu tiên: 'library (zoo); ym <- as.yearmon ("2012-01") + 0: 3/12'. Nếu bạn muốn ngày tháng vào ngày cuối cùng của tháng thì 'as.Date (ym, frac = 1)'. –

+0

G.Gothendieck: Cảm ơn bạn đã đề xuất, tôi sẽ nhớ sử dụng lớp yearmon cho loại dữ liệu ngày này trong tương lai. – MikeTP

Trả lời

15

Để kết thúc tháng bạn chỉ có thể tạo một vector Date chứa ngày 1 của tất cả các tháng tiếp theo và trừ 1 ngày.

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

Cảm ơn James nhưng điều này dường như không hoạt động trong cấu trúc khung dữ liệu. – MikeTP

+0

thư viện (lubridate) date.start.month = seq (as.Date ("2012-01-01"), length = 4, by = "months") df = data.frame (date.start.month) df $ date.end.month = df $ date.start.month + months (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 Dường như nó hoạt động với tôi, nhưng kết quả ví dụ của bạn đã gây nhầm lẫn: Tại sao ngày 27 tháng 4? – James

6

Sử dụng timeLastDayInMonth từ timeDate gói:

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

Một chức năng như dưới đây sẽ làm việc (giả dt là vô hướng) -

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

Nếu bạn có một vector của Ngày , sau đó thực hiện theo các bước sau -

sapply(dates, month_end) 
4

Dưới đây là một giải pháp sử dụng các gói 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" 

này sử dụng khái niệm tương tự được đưa ra bởi James ở trên, trong đó nó được trong ngày đầu tiên của tháng tiếp theo và trừ một ngày.

Nhân tiện, thao tác này sẽ hoạt động ngay cả khi ngày nhập không nhất thiết phải là ngày đầu tiên của tháng. Ví dụ: hôm nay là ngày 27 của tháng và ngày này vẫn trả về ngày cuối cùng chính xác của tháng:

ceiling_date(Sys.Date(), "month") - days(1) 
[1] "2017-07-31" 
Các vấn đề liên quan