Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What are the "standard unambiguous date" formats for string-to-date conversion in R?

Please consider the following

$ R --vanilla  > as.Date("01 Jan 2000") Error in charToDate(x) :     character string is not in a standard unambiguous format 

But that date clearly is in a standard unambiguous format. Why the error message?

Worse, an ambiguous date is apparently accepted without warning or error and then read incorrectly!

> as.Date("01/01/2000") [1] "0001-01-20" 

I've searched and found 28 other questions in the [R] tag containing this error message. All with solutions and workarounds involving specifying the format, iiuc. This question is different in that I'm asking where are the standard unambiguous formats defined anyway, and can they be changed? Does everyone get these messages or is it just me? Perhaps it is locale related?

In other words, is there a better solution than needing to specify the format?

29 questions containing "[R] standard unambiguous format"

> sessionInfo() R version 2.15.2 (2012-10-26) Platform: x86_64-w64-mingw32/x64 (64-bit)  locale: [1] LC_COLLATE=English_United Kingdom.1252 [2] LC_CTYPE=English_United Kingdom.1252 [3] LC_MONETARY=English_United Kingdom.1252 [4] LC_NUMERIC=C [5] LC_TIME=English_United Kingdom.1252  attached base packages: [1] stats     graphics  grDevices utils     datasets  methods   base 
like image 906
Matt Dowle Avatar asked Feb 07 '13 15:02

Matt Dowle


People also ask

Which date format is unambiguous?

The right format for dates in data -- and in the real world -- is one that is totally unambiguous.

How do I convert a string to a date in R?

Date() function in R Language is used to convert a string into date format.

What does character string is not in a standard unambiguous format?

The character string is not in a standard unambiguous format is a problem that can occur when changing date format using the posixct function. It occurs when converting numeric dates to calendar dates. It is not a problem caused by leading zeros but by using the wrong format in your numeric date.

How do I convert a character to a date in R?

You can use the as. Date( ) function to convert character data to dates. The format is as. Date(x, "format"), where x is the character data and format gives the appropriate format.


2 Answers

This is documented behavior. From ?as.Date:

format: A character string. If not specified, it will try '"%Y-%m-%d"' then '"%Y/%m/%d"' on the first non-'NA' element, and give an error if neither works.

as.Date("01 Jan 2000") yields an error because the format isn't one of the two listed above. as.Date("01/01/2000") yields an incorrect answer because the date isn't in one of the two formats listed above.

I take "standard unambiguous" to mean "ISO-8601" (even though as.Date isn't that strict, as "%m/%d/%Y" isn't ISO-8601).

If you receive this error, the solution is to specify the format your date (or datetimes) are in, using the formats described in the Details section in ?strptime.

Make sure that the order of the conversion specification as well as any separators correspond exactly with the format of your input string. Also, be sure to use particular care if your data contain day/month names and/or abbreviations, as the conversion will depend on your locale (see the examples in ?strptime and read ?LC_TIME; see also strptime, as.POSIXct and as.Date return unexpected NA).

like image 93
Joshua Ulrich Avatar answered Oct 01 '22 04:10

Joshua Ulrich


In other words, is there a better solution than needing to specify the format?

Yes, there is now (ie in late 2016), thanks to anytime::anydate from the anytime package.

See the following for some examples from above:

R> anydate(c("01 Jan 2000", "01/01/2000", "2015/10/10")) [1] "2000-01-01" "2000-01-01" "2015-10-10" R>  

As you said, these are in fact unambiguous and should just work. And via anydate() they do. Without a format.

like image 45
Dirk Eddelbuettel Avatar answered Oct 01 '22 06:10

Dirk Eddelbuettel