2009-12-01 2 views
5

sto ottenendo un risultato che non capisco in R.Perché l'analisi di "% Y-% m" viene eseguita con l'intervallo in R dando un risultato NA, ma "% Y-% m-% d" funziona?

Se io uso strptime con un anno e il giorno formattato% Y-% m (come "2009-12"), ottengo un risultato NA. Ma se aggiungo un giorno, come "2009-12-01", e cambio di conseguenza la stringa di formato, ottengo un risultato. Esempio:

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

Perché è quello?

Update: La cosa mi incuriosisce è il motivo per cui strptime non analizza un anno e un mese, e la ragione sembra strano che non sarebbe farlo è perché fa analizzare un anno solo, o un anno-e-un-giorno:

> 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 per spiegare il motivo per cui questo non è un duplicato L'eventuale duplicato è stato chiesto un paio di anni dopo questa domanda e si occupa di un'API separata in R: la funzione asDate. Questa domanda riguarda una peculiarità della funzione strptime che si applica ancora a R 3.1.3.

+2

Poiché le date sono giorni? Cosa ti aspetti che emetta? – hadley

+0

Volevi che fosse il giorno dell'anno? Se è così, prova "% j". –

+1

Mi aspettavo che usasse il giorno corrente come predefinito, il modo in cui lo farà se esegui il timeout ("2009", format = "% Y"). Ciò risulta in "2009-12-01". – bantic

risposta

1

Sembra un comportamento ragionevole per me. Per come la vedo io, una domanda migliore sarebbe "perché ti permette di fare questo: strptime("2009-03",format="%Y-%d")?"

Ecco una soluzione per ottenere ciò che penso che stai cercando di raggiungere (vale a dire un oggetto POSIXlt con un mese e anno specificato, ma il giorno di oggi):

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

Quindi è solo una strana idiosincrasia della lingua? – bantic

+1

No, è un requisito come 'data' indica un giorno in un mese in un anno, e solo un dare un mese e un anno non è equivalente. –

+1

Ma allora perché funziona se gli dai solo un anno o solo un anno e un giorno? – bantic

1

Sto solo indovinando qui. Ma se ci vuole un anno e un giorno, probabilmente ci vorranno un anno e un giorno nel range di 1-365 (o 366 per gli anni bisestili). Quello che potresti fare è usare paste() e aggiungere -01 alla fine per ottenere il formato standard YYYY-MM-DD.

Ecco il test che ho eseguito.

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

rendimenti "2009-05-12"