How to convert Excel date format to proper date in R

104,193

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")
Share:
104,193

Related videos on Youtube

elksie5000
Author by

elksie5000

Macmillan Cancer Support

Updated on March 17, 2022

Comments

  • elksie5000
    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
      count about 7 years
      This might set you up.
    • elksie5000
      elksie5000 about 7 years
      Thank you for such a fast reply.
  • elksie5000
    elksie5000 about 7 years
    Thank you for that. I'm still very new to R. It worked a treat.
  • Andrew Brēza
    Andrew Brēza about 7 years
    Quite 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
    Andrew Brēza about 7 years
    Actually 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
    elksie5000 about 7 years
    Oh, 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
    Andrew Brēza about 7 years
    That'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
    elksie5000 about 7 years
    Hey, I just appreciated your swift response. Thank you.
  • Robert Alan Greevy Jr PhD
    Robert Alan Greevy Jr PhD about 4 years
    This 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
    Clément LVD almost 4 years
    In 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
    Suren almost 4 years
    convertToDateTime if it is datetime.
  • userLL
    userLL over 2 years
    convert_to_date() - also from the janitor package - can be used when there is a mix of Excel numeric dates and actual dates
  • Mehrad Mahmoudian
    Mehrad Mahmoudian over 2 years
    For 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/…