2009-12-01 32 views
5

Tôi nhận được kết quả là tôi không hiểu trong R.Tại sao phân tích cú pháp "% Y-% m" bằng cách sử dụng strptime trong R cho kết quả NA, nhưng "% Y-% m-% d" hoạt động?

Nếu tôi sử dụng strptime với năm và ngày được định dạng% Y-% m (như "2009-12"), tôi nhận được kết quả NA. Nhưng nếu tôi thêm một ngày, như "2009-12-01", và thay đổi chuỗi định dạng cho phù hợp, tôi sẽ nhận được kết quả. Ví dụ:

> strptime("2009-12",format="%Y-%m") 
[1] NA 
> strptime("2009-12-03",format="%Y-%m-%d") 
[1] "2009-12-03" 

Tại sao lại như vậy?

Cập nhật: Điều tôi tò mò về là lý do strptime không phân tích một năm và một tháng, và lý do nó có vẻ lạ rằng nó sẽ không làm như vậy là vì nó không phân tích một năm chỉ, hoặc một năm và một ngày:

> strptime("2009",format="%Y") # year only. Works. Uses current month and day as defaults. 
[1] "2009-12-02" 
> strptime("2009-03",format="%Y-%d") # year and day. Works. Uses current month as default. 
[1] "2009-12-03" 
> strptime("2009-03",format="%Y-%m") # year and month. Doesn't work. ? 
[1] NA 

Update để giải thích lý do tại sao đây không phải là một bản sao Các bản sao có thể được hỏi một vài năm sau khi câu hỏi này và nó là có liên quan với một API riêng biệt trong R: chức năng asDate. Câu hỏi này là về một sự gian lận của hàm strptime có nghĩa là R 3.1.3 vẫn được áp dụng.

+2

Bởi vì ngày có những ngày? Bạn mong đợi nó ra sao? – hadley

+0

Bạn có muốn là ngày trong năm không? Nếu vậy, hãy thử "% j". –

+1

Tôi đã hy vọng nó sẽ sử dụng ngày hiện tại làm mặc định, cách nó sẽ làm nếu bạn làm strptime ("2009", format = "% Y"). Điều này dẫn đến "2009-12-01". – bantic

Trả lời

1

Điều đó có vẻ như hành vi hợp lý đối với tôi. Như tôi thấy, một câu hỏi hay hơn sẽ là "tại sao nó cho phép bạn làm điều này: strptime("2009-03",format="%Y-%d")?"

Dưới đây là một cách giải quyết để có được những gì tôi nghĩ rằng bạn đang cố gắng để đạt được (ví dụ: một đối tượng POSIXlt với một tháng cụ thể và năm, nhưng ngày hôm nay):

as.POSIXlt(paste("2009-12", days(Sys.Date()), sep="-")) 
+0

Vì vậy, nó chỉ là một phong cách riêng kỳ lạ của ngôn ngữ? – bantic

+1

Không, yêu cầu của nó là 'ngày' chỉ định một ngày trong một tháng trong một năm và chỉ một tháng và một năm là không tương đương. –

+1

Nhưng tại sao nó hoạt động nếu bạn cho nó chỉ một năm, hoặc chỉ một năm và một ngày? – bantic

1

Tôi chỉ đoán ở đây. Nhưng nếu phải mất một năm và một ngày, nó có thể mất một năm và một ngày trong phạm vi 1-365 (hoặc 366 cho năm nhuận). Những gì bạn có thể làm là sử dụng paste() và thêm -01 ở cuối để có định dạng YYYY-MM-DD tiêu chuẩn.

Đây là bài kiểm tra tôi đã chạy.

strptime("2009-123",format="%Y-%d") 

lợi nhuận "2009-05-12"

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