12

I'm working with monthly data and have a character vector of dates, formatted:

Sep/2012
Aug/2012
Jul/2012

and so on, back to 1981. I've tried using

as.Date(dates, "%b/%Y")

where %b represents month abbreviations, but this only returns NAs. What am I doing wrong?

Note: I already found a workaround using gsub() to add "01/" in front of each entry, like so:

01/Sep/2012
01/Aug/2012
01/Jul/2012

Then as.Dates() works, but this seems a little inelegant, and isn't strictly accurate anyway.

steve
  • 145
  • 1
  • 2
  • 6
  • 6
    Technically speaking, a month and a year do not specify a date, which is why this happens. I believe the **zoo** package has some functions for handling monthly data without days. – joran Nov 14 '12 at 19:49
  • Good point and noted for the future - I think the **zoo** package is exactly what I needed. – steve Nov 14 '12 at 20:37

1 Answers1

19

You are looking for as.yearmon() in the zoo package. Given your dates

dates <- c("Sep/2012","Aug/2012","Jul/2012")

we load the package and convert to the "yearmon" class

require(zoo)
dates1 <- as.yearmon(dates, format = "%b/%Y")
dates1

Which gives

R> dates1
[1] "Sep 2012" "Aug 2012" "Jul 2012"

You can coerce to an object of class "Date" using the as.Date() method

R> as.Date(dates1)
[1] "2012-09-01" "2012-08-01" "2012-07-01"

Which would be a simpler way of getting the thing you did via gsub(). There is a frac argument which controls how far through the month the day component should be:

R> as.Date(dates1, frac = 0.5)
[1] "2012-09-15" "2012-08-16" "2012-07-16"

But that may ont be sufficient for you.

If you really only want the dates stored as you have them, then they aren't really dates but if you are happy to work within the zoo package then the "yearmon" class can be used as an index for a zoo object which is a time series.

Gavin Simpson
  • 170,508
  • 25
  • 396
  • 453
  • Really excellent answer, thanks for going into detail. – steve Nov 14 '12 at 20:37
  • wonderful answer!! I was struggling after using zoo and tsibble to change to yearmon which lubridate won’t accept anymore as a 3 letter month to switch formats. This is much straight forward. Thanks – SamV Mar 29 '21 at 13:10