2011-09-20 24 views
6

Tôi thiếu một số thứ hiển nhiên với phần "định dạng" của as.Date. Hãy xem xét ví dụ nàyKhông thể định dạng tháng với tên.Date

d1 <- data.frame(d = c("1/Jan/1947", "1/Feb/1947", "1/Mar/1947"), d2 = c("Jan/1947", "Feb/1947", "Mar/1947"))

d1$date1 <- as.Date(x=d1$d, format="%d/%b/%Y") 
d1$date2 <- as.Date(x=d1$d2, format="%b/%Y") 

      d  d2  date1 date2 
1 1/Jan/1947 Jan/1947 1947-01-01 <NA> 
2 1/Feb/1947 Feb/1947 1947-02-01 <NA> 
3 1/Mar/1947 Mar/1947 1947-03-01 <NA> 

vì vậy câu hỏi của tôi là thực sự rất đơn giản - Tôi không hiểu tại sao các công trình date1 nhưng date2 không.

+3

Nếu thay vì "tại sao" bạn đã yêu cầu "làm thế nào", thì câu trả lời sẽ là"' yêu cầu (sở thú); d1 $ date2 <- như. yearmon (d1 $ d2, format = "% b /% Y") ' –

+4

Lớp' "yearmon" 'trong gói sở thú có thể xử lý năm/tháng không có ngày. –

Trả lời

15

Câu trả lời đơn giản nhất là một ngày là một cái gì đó trong đó bao gồm một ngày và nếu ai không quy định, as.Date() bị nhầm lẫn. Từ tài liệu? As.Date:

Nếu chuỗi ngày không chỉ định ngày hoàn toàn, thì câu trả lời trả về có thể là hệ thống cụ thể. Hành vi phổ biến nhất là giả định rằng năm, tháng hoặc ngày bị thiếu là hiện tại. Nếu nó chỉ định ngày không chính xác, việc triển khai đáng tin cậy sẽ đưa ra lỗi và ngày được báo cáo là ‘NA’. Rất tiếc, một số triển khai phổ biến (chẳng hạn như ‘glibc’) không đáng tin cậy và đoán theo ý nghĩa dự định.

Khi bạn nghĩ về điều đó, một thuật ngữ như "Mar/1947" không, nói đúng, một ngày - nó chỉ là sự kết hợp giữa tháng và năm. Ngày tháng là ngày cụ thể vào tháng 3 năm 1947 (hoặc bất kỳ tháng nào khác + năm) - vì bạn không chỉ định ngày, bạn không có ngày.

0

Tôi không biết, nhưng% b dường như không hoạt động khi đó là trường dẫn đầu.

Sau đây tất cả thất bại (cho NA):

> as.Date("Jan/1947", format="%b/%Y") 
> as.Date("Jan 1947", format="%b %Y") 
> as.Date("jan1947", format="%b%Y") 
> as.Date("Jan1947", format="%b%Y") 

trong khi đó khi bạn đặt trước% b với% d, nó hoạt động:

> as.Date("1Jan1947", format="%d%b%Y") 
> as.Date("29-Jan-1947", format="%d-%b-%Y") 
> as.Date("08/Aug/1947", format="%d/%b/%Y") 
> as.Date("22 Dec 1947", format="%d %b %Y") 

Có vẻ như neilfws có câu trả lời về bất toàn. này cũng sẽ giải thích lý do tại sao cho chỉ có năm cung cấp cho:

> as.Date("1947", format="%Y") 
[1] "1947-09-19" 
+1

Vấn đề không phải là% b là trường dẫn đầu, nhưng một ngày là mất tích – neilfws

+0

Ahh các downvoters – smci

8

Đó là vì d2 trong số data.frame của bạn là ngày không đúng định dạng. Nó không chứa một ngày. Để có được vòng này, hãy xem xét sử dụng như sau:

d1$date2 <- as.Date(x=paste("1/",d1$d2, sep=""), format="%d/%b/%Y") 
> d1 
      d  d2  date1  date2 
1 1/Jan/1947 Jan/1947 1947-01-01 1947-01-01 
2 1/Feb/1947 Feb/1947 1947-02-01 1947-02-01 
3 1/Mar/1947 Mar/1947 1947-03-01 1947-03-01 
+0

này là rất gọn gàng, cảm ơn. – tomw

Các vấn đề liên quan