R: How to Convert Character to Date Using Lubridate


You can use various functions from the lubridate package in R to convert a character column to a date format.

Two of the most common functions include:

  • ymd() – Convert character in year-month-date format to date
  • mdy() – Convert character in month-day-year format to date

The following examples show how to use the ymd() and mdy() functions in practice.

Note: Refer to the lubridate documentation for a complete list of functions you can use to convert characters to dates depending on the format your dates are in.

Example 1: Convert Character to Date Using ymd()

Suppose we have the following data frame in R:

#create data frame
df <- data.frame(date=c('2022-01-05', '2022-02-18', '2022-03-21',
                        '2022-09-15', '2022-10-30', '2022-12-25'),
                 sales=c(14, 29, 25, 23, 39, 46))

#view data frame
df

        date sales
1 2022-01-05    14
2 2022-02-18    29
3 2022-03-21    25
4 2022-09-15    23
5 2022-10-30    39
6 2022-12-25    46

#view class of date column
class(df$date)

[1] "character"

Currently the values in the date column are characters, but we can use the ymd() function from the lubridate package to convert them to dates:

library(lubridate)

#convert character to date format
df$date <- ymd(df$date)

#view updated data frame
df

        date sales
1 2022-01-05    14
2 2022-02-18    29
3 2022-03-21    25
4 2022-09-15    23
5 2022-10-30    39
6 2022-12-25    46

#view updated class of date column
class(df$date)

[1] "Date"

We can see that the date column now has a class of Date instead of character.

Example 2: Convert Character to Date Using mdy()

Suppose we have the following data frame in R:

#create data frame
df <- data.frame(date=c('March 4, 2022', 'April 9, 2022', 'May 6, 2022',
                        'May 29, 2022', 'June 1, 2022', 'July 2, 2022'),
                 sales=c(14, 29, 25, 23, 39, 46))

#view data frame
df

           date sales
1 March 4, 2022    14
2 April 9, 2022    29
3   May 6, 2022    25
4  May 29, 2022    23
5  June 1, 2022    39
6  July 2, 2022    46

#view class of date column
class(df$date)

[1] "character"

Currently the values in the date column are characters, but we can use the mdy() function from the lubridate package to convert them to dates:

library(lubridate)

#convert character to date format
df$date <- mdy(df$date)

#view updated data frame
df

        date sales
1 2022-03-04    14
2 2022-04-09    29
3 2022-05-06    25
4 2022-05-29    23
5 2022-06-01    39
6 2022-07-02    46

#view updated class of date column
class(df$date)

[1] "Date"

We can see that the date column now has a class of Date instead of character.

Additional Resources

The following tutorials explain how to perform other common tasks in R:

How to Convert Date to Numeric in R
How to Extract Month from Date in R
How to Add and Subtract Months from a Date in R

5 Replies to “R: How to Convert Character to Date Using Lubridate”

  1. Hi,
    Very helpful! but I am getting a “replacement has 0 rows, data has x” error. I’ve read where you explain this is because the column has not been created first, but the “df$date <- mdy(df$date)" syntax suggest conversion of an existing column, not the creation of a new one. What am I missing?

    1. Hi Marcus…The error “replacement has 0 rows, data has x” in R usually arises when the length of the object being assigned does not match the number of rows in the data frame. This often occurs if the operation results in `NULL` or has a mismatch in lengths.

      In your case, the syntax `df$date <- mdy(df$date)` suggests you are attempting to convert an existing column (`df$date`) to a date format using the `mdy()` function (likely from the **lubridate** package). Here's what might be causing the issue and how to resolve it: ### Possible Issues: 1. **Empty or Incorrect `df$date` Column**: - If `df$date` is empty, missing, or does not contain valid date strings, the `mdy()` function might return `NULL` or an empty vector, causing the error. 2. **Non-standard or Unexpected Input Format**: - If the data in `df$date` is not in a format compatible with `mdy()` (e.g., unexpected separators or invalid dates), the conversion may fail. 3. **Data Frame Structure**: - If the data frame `df` does not contain a column named `date`, attempting to modify it will throw this error. ### Steps to Debug and Fix: 1. **Check the Data**: - Inspect the `df$date` column to ensure it exists and contains valid data. ```R head(df$date) str(df$date) ``` 2. **Validate Input for `mdy()`**: - Ensure that the strings in `df$date` are in a format compatible with the `mdy()` function (e.g., "MM/DD/YYYY"). ```R library(lubridate) test_dates <- c("01/15/2023", "02/28/2023", "03/01/2023") mdy(test_dates) ``` 3. **Apply Conditional Conversion**: - Use `is.na()` or other checks to handle problematic rows gracefully. ```R library(dplyr) df <- df %>%
      mutate(date = if_else(!is.na(date) & date != “”, mdy(date), NA_Date_))
      “`

      4. **Create the Column First** (if it doesn’t exist):
      – If the `date` column doesn’t exist, create it before assigning the conversion.
      “`R
      if (!”date” %in% colnames(df)) {
      df$date <- NA } df$date <- mdy(df$date) ``` 5. **Handle Conversion Warnings or Errors**: - You can use `suppressWarnings()` to ignore non-critical warnings during conversion. ```R df$date <- suppressWarnings(mdy(df$date)) ``` ### Example: ```R # Example data df <- data.frame(date = c("01/15/2023", "invalid date", "02/28/2023")) # Check for valid format before conversion library(lubridate) df$date <- mdy(df$date) # Inspect result print(df) ``` If these steps don’t resolve your issue, double-check the structure of your data and share a small sample of the `df$date` column for further troubleshooting.

  2. Hi,
    I have dates that are character and I am trying to use lubridate::ym to just get the year and month.
    > head(np_ds1$activity_start_date)
    [1] “01/14/2019” “12/10/2018” “10/18/2019” “03/16/2019” “09/12/2019” “08/09/2019”
    > class(np_ds1$activity_start_date)
    [1] “character”
    When I submit np_ds1$ym <- lubridate::ym(np_ds1$activity_start_date)
    I get: Warning message:
    All formats failed to parse. No formats found.

Leave a Reply

Your email address will not be published. Required fields are marked *