Dates formatted as 4/29/2016 are parsed correctly, but dates formatted as 6242016 and 2042016 are not parsed.
Does R think that some of the dates without the slash have day first instead of month?
I've tried including dmy in lubrdiate and it still doesn't work.
I've tried looking at Sys.getlocale("LC_TIME") and it gives me "English_United States.1252".
demo$date <- as.character(demo$date)
demo <- demo %>%
mutate(date = parse_date_time(date, "mdy"))
You can wrangle your dates all into the same format using stringr. Then convert to numeric and use lubridate to parse.
library(stringr)
library(lubridate)
dates <- c("6242016", "2042016", "4/29/2016")
dates <- str_remove_all(dates, "/")
dates <- as.numeric(dates)
lubridate::mdy(dates)
# [1] "2016-06-24" "2016-02-04" "2016-04-29"
as.Date(sprintf("%08d",
as.numeric(gsub("/", "", c("6242016", "2042016", "4/29/2016")))),
format = "%m%d%Y")
# [1] "2016-06-24" "2016-02-04" "2016-04-29"
This
as.Date("2042016", "%m%d%Y")
returns NA as opposed to
as.Date("02042016", "%m%d%Y")
This is because the month has to be represented by two digits (00-12)
Try adding a leading zero for months in the range [1,9].
Related
So I have this long dataset, where in one column I have a date specified as character in format YYYMMM, but month abbreviated. So for example 1995MAR, 1995APR and so on. How can I transform that to date format?
I tried as.Date but it obviously hasn't worked, and with lubridate::ymd which hasn't worked as well.
Using parse_date_time from lubridate
date <- "1995MAR"
library(lubridate)
parse_date_time(date, order = "Yb")
Output:
[1] "1995-03-01 UTC"
Alternatively using zoo
library(zoo)
as.Date(as.yearmon(date, '%Y%b'))
Output:
"1995-03-01"
str(as.Date(as.yearmon(date, '%Y%b')))
Date[1:1], format: "1995-03-01"
In Base R, add a day number to parse:
date <- "1995MAR"
as.Date(paste(date, "01"), format = "%Y%b %d")
#[1] "1995-03-01"
I was looking to convert the following character string in a date format:
string <- '22APR2020'
date <- as.Date(string, format='%d%b%y')
date
>>> NA
Unfortunately, the result is NA and I need to convert it as a date in order to being able to calculate the time between two dates.
Thanks you
You could use the anytime package:
library(anytime)
string <- '22APR2020'
anytime::anydate(string)
[1] "2020-04-22"
When in doubt always use lubridate:
string <- '22APR2020'
library(lubridate)
dmy(string)
[1] "2020-04-22"
here dmy is order of date, month and year appearance.
The problem is your locale setting. It probably is set to a language where the fourth month is not abbreviated as "APR".
Sys.setlocale("LC_TIME", "French")
string <- '22APR2020'
as.Date(string, format='%d%b%Y')
#[1] NA
Sys.setlocale("LC_TIME", "German")
as.Date(string, format='%d%b%Y')
#[1] "2020-04-22"
Also, note the capital Y is used in the format string. It's important. y only refers to the decade (it would give the same result, by chance, for 2020, but give the wrong result for 2021).
Would like to change a column of my data.frame into the date format in R.
The problem is that the format of the column is not consistent.
Most rows are in the format "%Y-%m-%d" and I can change them easily with the as.Date() function.
Few rows are in the format "%Y/%d/%m" and can't change them with the as.Date() function but instead I get NA's.
input <- c("2019-01-22", "2019-04-17", "2019/27/05", "2019/13/05", "2019/15/06", "2019-07-30")
Input: Output:
Dates Dates
2019-01-22 2019-01-22
2019-04-17 2019-04-17
2019/27/05 2019-27-05
2019/13/05 2019-13-05
2019/15/06 2019-15-06
2019-07-30 2019-07-30
In your case, in which you have "%Y-%m-%d" and "%Y/%d/%m", you might to use as.Date including the format it has. So, for example:
input <- c("2019-10-11", "2019/27/10", "2014-12-10")
If you use:
input2 <- ifelse(grepl("/",input), format(as.Date(input,"%Y/%d/%m"),"%Y-%m-%d"), input)
then:
> input2
[1] "2019-10-11" "2019-10-27" "2014-12-10"
If you have only these two formats you can substitute all the / for -:
Example:
input <- c("2019-10-11", "2019/10/12", "2014-10-13")
as.Date(gsub("/", "-", input), format = "%Y-%m-%d")
# [1] "2019-10-11" "2019-10-12" "2014-10-13"
If you just want to replace / by - for just a few rows, I think the following code might be an efficiency way to do the replacement
output <- as.Date(input)
output[is.na(output)]<-as.Date(input[is.na(output)],format = "%Y/%d/%m")
such that
> output
[1] "2019-01-22" "2019-04-17" "2019-05-27" "2019-05-13" "2019-06-15" "2019-07-30"
We can use anydate from anytime
library(anytime)
anydate(input)
#[1] "2019-10-11" "2019-10-12" "2014-10-13"
Or using lubridate
library(lubridate)
ymd(input)
data
input <- c("2019-10-11", "2019/10/12", "2014-10-13")
I can't figure out how to turn Sys.Date() into a number in the format YYYYDDD. Where DDD is the day of the year, i.e. Jan 1 would be 2016001 Dec 31 would be 2016365
Date <- Sys.Date() ## The Variable Date is created as 2016-01-01
SomeFunction(Date) ## Returns 2016001
You can just use the format function as follows:
format(Date, '%Y%j')
which gives:
[1] "2016161" "2016162" "2016163"
If you want to format it in other ways, see ?strptime for all the possible options.
Alternatively, you could use the year and yday functions from the data.table or lubridate packages and paste them together with paste0:
library(data.table) # or: library(lubridate)
paste0(year(Date), yday(Date))
which will give you the same result.
The values that are returned by both options are of class character. Wrap the above solutions in as.numeric() to get real numbers.
Used data:
> Date <- Sys.Date() + 1:3
> Date
[1] "2016-06-09" "2016-06-10" "2016-06-11"
> class(Date)
[1] "Date"
Here's one option with lubridate:
library(lubridate)
x <- Sys.Date()
#[1] "2016-06-08"
paste0(year(x),yday(x))
#[1] "2016160"
This should work for creating a new column with the specified date format:
Date <- Sys.Date
df$Month_Yr <- format(as.Date(df$Date), "%Y%d")
But, especially when working with larger data sets, it is easier to do the following:
library(data.table)
setDT(df)[,NewDate := format(as.Date(Date), "%Y%d"
Hope this helps. May have to tinker if you only want one value and are not working with a data set.
I`m giving an input as "a <- [12/Dec/2014:05:45:10]"
a is not a time-stamp so cannot use any time and date functions
Now I want the above variable to be split down into 2 parts as:-
date --> 12/Dec/2014
time --> 05:45:10
Any help will be appreciated.
You can use gsub to create a space between the Date and Time and use that to create two columns with read.table
read.table(text=gsub('^\\[([^:]+):(.*)+\\]', '\\1 \\2', a),
sep="", col.names=c('Date', 'Time'))
# Date Time
# 1 12/Dec/2014 05:45:10
Or you can use lubridate to convert it to a 'POSIXct' class
library(lubridate)
a1 <- dmy_hms(a)
a1
#[1] "2014-12-12 05:45:10 UTC"
If we need two columns with the specified format
d1 <- data.frame(Date= format(a1, '%d/%m/%Y'), Time=format(a1, '%H:%M:%S'))
data
a <- "[12/Dec/2014:05:45:10]"
Code
a <- "[12/Dec/2014:05:45:10]"
Sys.setlocale("LC_TIME", "C") # depends on your local setting
as.POSIXlt(a, format = "[%d/%b/%Y:%H:%M:%S]")
Explanation
Depending on your local setting you need to change it such that the abbreviated month names can be read. Then you can use as.POSIXlt together with the format string to convert your string in a date.