2009-12-01 74 views
5

我得到一個結果,我不R.爲什麼使用R中的strptime解析「%Y-%m」給出NA結果,但是「%Y-%m-%d」是可用的?

明白如果我使用strptime用了一年的一天格式化%Y-%M(如「2009-12」),我得到一個NA的結果。但是如果我添加一天,比如「2009-12-01」,並相應地更改格式字符串,我確實會得到結果。例如:

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

這是爲什麼?

更新:我很好奇就是爲什麼strptime不分析了一年一個月,原因似乎不可思議,它不會做這樣的事情是因爲它確實一年解析只是,或一年,和一個天:

> 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 

更新來解釋爲什麼這是不是重複 可能重複被問這個問題在幾年之後,它關注的是一個單獨的API在RasDate功能。這個問題是關於strptime函數的一個怪癖,那個函數截取R 3.1.3仍然適用。

+2

因爲日期有幾天?你期望它輸出什麼? – hadley 2009-12-01 19:27:52

+0

你想成爲今年的一天嗎?如果是這樣,請嘗試「%j」。 – 2009-12-01 19:38:29

+1

我曾期待它將當前日期作爲默認值,如果您執行strptime(「2009」,format =「%Y」),它將執行此操作。這導致「2009-12-01」。 – bantic 2009-12-01 19:44:09

回答

1

這對我來說似乎是明智的行爲。正如我所看到的,更好的問題是「爲什麼它允許你這樣做:strptime("2009-03",format="%Y-%d")?」

這裏有一個變通方法來得到什麼,我想你想實現(即與指定的月份和年份,但今天的一天POSIXlt對象):

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

所以這只是一種奇怪的語言特質? – bantic 2009-12-01 22:37:50

+1

不,它作爲'日期'的要求指定一年中一個月中的某一天,而只是給予一個月和一年不等同。 – 2009-12-01 23:30:05

+1

但是如果你只給它一年,或只有一年一天,它爲什麼會起作用? – bantic 2009-12-02 15:53:34

1

我只是猜測這裏。但是,如果需要一年一天的時間,那麼可能需要一年一天的時間,範圍在1-365(或閏年爲366)。你可以做的是使用paste()並在最後添加-01以獲得標準的YYYY-MM-DD格式。

這是我跑的測試。

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

回報"2009-05-12"

相關問題