How to extract Month from date in R

RLubridate

R Problem Overview


I am using the lubridate package and applying the month function to extract month from date. I ran the str command on date field and I got

Factor w/ 9498 levels "01/01/1979","01/01/1980",..: 5305 1 1 1 1 1 1 1 1 1 ...

> v1$Date<-month(v1$Date)
Error in as.POSIXlt.character(as.character(x), ...) : 
character string is not in a standard unambiguous format

Here is an example of my data frame

https://drive.google.com/file/d/0B6cqWmwsEk20Q2dHblhXZi14Wk0/edit?usp=sharing

I don't know what I am doing wrong.

R Solutions


Solution 1 - R

?month states:

> Date-time must be a POSIXct, POSIXlt, Date, Period, chron, yearmon, > yearqtr, zoo, zooreg, timeDate, xts, its, ti, jul, timeSeries, and fts > objects.

Your object is a factor, not even a character vector (presumably because of stringsAsFactors = TRUE). You have to convert your vector to some datetime class, for instance to POSIXlt:

library(lubridate)
some_date <- c("01/02/1979", "03/04/1980")
month(as.POSIXlt(some_date, format="%d/%m/%Y"))
[1] 2 4

There's also a convenience function dmy, that can do the same (tip proposed by @Henrik):

month(dmy(some_date))
[1] 2 4

Going even further, @IShouldBuyABoat gives another hint that dd/mm/yyyy character formats are accepted without any explicit casting:

month(some_date)
[1] 2 4

For a list of formats, see ?strptime. You'll find that "standard unambiguous format" stands for

> The default formats follow the rules of the ISO 8601 international > standard which expresses a day as "2001-02-28" and a time as > "14:01:02" using leading zeroes as here.

Solution 2 - R

Without the need of an external package:

if your date is in the following format:

myDate = as.POSIXct("2013-01-01")

Then to get the month number:

format(myDate,"%m")

And to get the month string:

format(myDate,"%B")

Solution 3 - R

You can convert it into date format by-

new_date <- as.Date(old_date, "%m/%d/%Y")

from new_date, you can get the month by strftime()

month<- strftime(new_date, "%m")

old_date<- "01/01/1979"
new_date<- as.Date(old_date, "%m/%d/%Y")
new_date
#[1] "1979-01-01"
month<- strftime(new_date,"%m")
month
#[1] "01"
year<- strftime(new_date, "%Y")
year
#[1] "1979"

Solution 4 - R

Her is another R base approach:

From your example: Some date:

Some_date<-"01/01/1979"

We tell R, "That is a Date"

Some_date<-as.Date(Some_date)

We extract the month:

months(Some_date)

output: [1] "January"

Finally, we can convert it to a numerical variable:

as.numeric(as.factor(months(Some_date)))

outpt: [1] 1

Solution 5 - R

For some time now, you can also only rely on the data.table package and its IDate class plus associated functions. (Check ?as.IDate()). So, no need to additionally install lubridate.

require(data.table)

some_date <- c("01/02/1979", "03/04/1980")
month(as.IDate(some_date, '%d/%m/%Y')) # all data.table functions

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionapTNowView Question on Stackoverflow
Solution 1 - RtonytonovView Answer on Stackoverflow
Solution 2 - RRockScienceView Answer on Stackoverflow
Solution 3 - RJitesh KhuranaView Answer on Stackoverflow
Solution 4 - RRRuizView Answer on Stackoverflow
Solution 5 - RandscharView Answer on Stackoverflow