How to convert Excel date format to proper date in R
Solution 1
You don't need to use lubridate
for this, the base function as.Date
handles this type of conversion nicely. The trick is that you have to provide the origin, which in Excel is December 30, 1899.
as.Date(42705, origin = "1899-12-30")
# [1] "2016-12-01"
If you want to preserve your column types, you can try using the read_excel
function from the readxl
package. That lets you load an XLS or XLSX file with the number formatting preserved.
Solution 2
Here is another way to do it using janitor and tibble packages:
install.packages("janitor")
install.packages("tibble")
library(tibble)
library(janitor)
excel_numeric_to_date(as.numeric(as.character(YourDate)), date_system = "modern")
Solution 3
openxlsx
package also allows xls
date
conversion:
openxlsx::convertToDate(42705)
[1] "2016-12-01"
And as suggested by @Suren, convertToDateTime
allows datetime
conversion:
openxlsx::convertToDateTime(42705.5)
[1] "2016-12-01 12:00:00"
Solution 4
If you work with the data.table package you could use as.IDate()
for that:
require(data.table)
as.IDate(42705, origin = "1899-12-30")
# [1] "2016-12-01"
Works like base::as.Date()
here.
Solution 5
As it was said, very good options:
as.Date(42705, origin = "1899-12-30")
openxlsx::convertToDate(42705)
Another way also could be:
format(as.Date(as.Date("1899-12-30") + 42705, "%d-%m-%Y"), "%d-%m-%Y")
Note you can change the output format where it's written %d-%m-%Y
(first of all, convert as.numeric
if it's imported as character!,or converting in the formula:
format(as.Date(as.Date("1899-12-30") + as.numeric( number formatted as character), "%d-%m-%Y"), "%d-%m-%Y")
Related videos on Youtube
Comments
-
elksie5000 about 2 years
I'm working with a csv which unfortunately has logged datetimes using the number format of 42705 although it should be 01/12/2016.
I'd like to convert it to the right format in R using lubridate or some other package. Is there a function that will handle it?
-
count about 7 yearsThis might set you up.
-
elksie5000 about 7 yearsThank you for such a fast reply.
-
-
elksie5000 about 7 yearsThank you for that. I'm still very new to R. It worked a treat.
-
Andrew Brēza about 7 yearsQuite welcome. I'm editing my response now since I realized the origin is slightly off. Give me a minute before you use this code in your project :-)
-
Andrew Brēza about 7 yearsActually I just typed 01/12/2016 into Excel and converted it into a number. The value I got was 42381, not 42705. Using 42381 in the
as.Date
function gets you back to 1/12/2016. Are you sure that you copied the number correctly from Excel? -
elksie5000 about 7 yearsOh, I did exactly the same thing in my copy of Excel, but had a different number. Is because it's European day-month-year format?
-
Andrew Brēza about 7 yearsThat's exactly what happened, I should have asked what date format you were using. It's still early here in the states and I'm obviously not thinking clearly yet.
-
elksie5000 about 7 yearsHey, I just appreciated your swift response. Thank you.
-
Robert Alan Greevy Jr PhD about 4 yearsThis is my favorite solution, but one caution mentioned in the documentation for the "as.Date" function is the handling of leap years can vary between programs, e.g. Excel intentionally misclassifies 1900 as a leap year. If your dates cover broad range, double check the conversion for the min and max dates in your range.
-
Clément LVD almost 4 yearsIn the French version of excel, the best solution is quite fascinating, for a date with hours:
as_datetime(Date,origin = "1969-12-31 24:00:00")
-
Suren almost 4 years
convertToDateTime
if it is datetime. -
userLL over 2 yearsconvert_to_date() - also from the janitor package - can be used when there is a mix of Excel numeric dates and actual dates
-
Mehrad Mahmoudian over 2 yearsFor those who wonder where the 1899-12-30 came from and if it is correct, it seems in some Excel versions Microsoft has used 1900 as the reference date and in some versions 1904! for this reason I suggest you to confirm the date from some other source as well. Source: support.microsoft.com/en-us/office/…