Convert date-time string to class Date
You may be overcomplicating things, is there any reason you need the stringr package? You can use as.Date
and its format
argument to specify the input format of your string.
df <- data.frame(Date = c("10/9/2009 0:00:00", "10/15/2009 0:00:00"))
as.Date(df$Date, format = "%m/%d/%Y %H:%M:%S")
# [1] "2009-10-09" "2009-10-15"
Note the Details section of ?as.Date
:
Character strings are processed as far as necessary for the format specified: any trailing characters are ignored
Thus, this also works:
as.Date(df$Date, format = "%m/%d/%Y")
# [1] "2009-10-09" "2009-10-15"
All the conversion specifications that can be used to specify the input format
are found 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.
More generally and if you need the time component as well, use as.POSIXct
or strptime
:
as.POSIXct(df$Date, "%m/%d/%Y %H:%M:%S")
strptime(df$Date, "%m/%d/%Y %H:%M:%S")
I'm guessing at what your actual data might look at from the partial results you give.
Convert string into date format in R
The as.Date()
function will convert a string into date format, and the format of the output will always be in yyyy-mm-dd
format in R (ISO 8601). The format
argument in the as.Date()
function is to specify the date format of the string input. I remember I initially thought it was specifying the output format, but it's the input format (you can change the output format with a subsequent format()
function, however this will convert it back to a string).
Your string looks to be in ddmmyyyy
(%d%m%Y
) format, this should be what you specify as the format argument in as.Date()
. Your format does not include hyphens, so the format
argument should also not include hyphens. Note that ddmmyyyy
, dd-mm-yyyy
, dd/mm/yyyy
, dd.mm.yyyy
are all different date formats, even though the day, month and year are in the same order, they would be converted to date with formats %d%m%Y
, %d-%m-%Y
, %d/%m/%Y
, and %d.%m.%Y
, respectively.
Further advice on working with dates and times is available in the relevant chapters of R for Data Science by Wickham & Grolemund and The R Cookbook by Teetor & Long.
Convert Character into Date (R)
You could try adding a default day to the date, e.g. 01
, to make it a formal date:
data$year <- substr(data$month, 1, 4)
data$mon <- substr(data$month, 6, 8)
data$date <- as.Date(paste(data$year, data$mon, "01", sep="-"))
How to convert character into date format in R
A base R option (assuming that there are only two formats in the OP's 'create_date' column), will be to create a logical index with grepl
for those date elements that start with 'year', subset the 'create_date' based on the logical index ('i1'), convert to Date
class separately and assign those separately to a Date
vector of the same length as the number of rows of the dataset to create the full Date
class.
i1 <- grepl("^[0-9]{4}", df$create_date)
v1 <- as.Date(df$create_date[i1])
v2 <- as.Date(df$create_date[!i1], "%m/%d/%Y")
v3 <- Sys.Date() + 0:(nrow(df)-1)
v3[i1] <- v1
v3[!i1] <- v2
df$create_date <- v3
Or as I commented in the OP's post (first) parse_date_time
from lubridate
can be used
library(lubridate)
as.Date(parse_date_time(df$create_date, c('mdy', 'ymd_hms')))
#[1] "2016-08-13" "2016-08-13" "2016-08-13" "2016-08-13"
#[5] "2016-08-13" "2016-08-13" "2016-08-13"
data
df <- structure(list(create_date = c("8/13/2016", "8/13/2016",
"8/13/2016",
"2016-08-13T08:26:04Z", "2016-08-13T14:30:23Z", "8/13/2016",
"8/13/2016")), .Names = "create_date", class = "data.frame",
row.names = c(NA, -7L))
Convert an entire column from character to date class in R
Replacing the '.' with '/' works from your first example in the format:
Date <- mutate(crime, ArrestDate = as.Date(ArrestDate, format= "%m/%d/%Y"))
class(Date$ArrestDate)
[1] "Date"
Related Topics
Rename Multiple Columns Given Character Vectors of Column Names and Replacement
R: What Do You Call the :: and ::: Operators and How Do They Differ
Convert Character Matrix into Numeric Matrix
Function to Split a Matrix into Sub-Matrices in R
Exporting Non-S3-Methods with Dots in the Name Using Roxygen2 V4
Plot a Line Chart with Conditional Colors Depending on Values
How to Set the Default Language of Date in R
Ggplot2, Axis Not Showing After Using Theme(Axis.Line=Element_Line())
How to Convert Integer into Categorical Data in R
Extreme Numerical Values in Floating-Point Precision in R
Select Row with Most Recent Date by Group
Ordering of Points in R Lines Plot
Modify X-Axis Labels in Each Facet
R's Read.CSV Prepending 1St Column Name with Junk Text