5

I have a set of events that each have a start and end date, but they take place over the scope of a number of months. I would like to create a table that shows the number of days in each month for this event.

I have the following example.

event_start_date <- as.Date("23/10/2012", "%d/%m/%Y")
event_end_date   <- as.Date("07/02/2013", "%d/%m/%Y")

I would expect to get a table out as the following:

Oct-12  8
Nov-12  30
Dec-12  31
Jan-13  31
Feb-13  7

Does anybody know about a smart and elegant way of doing this or is creating a system of loops the only viable method?

Jochem

Jochem
  • 3,295
  • 4
  • 30
  • 55
  • 1
    I think you can just subtract the date see http://stackoverflow.com/questions/2254986/how-to-subtract-days-in-r – DjSol Nov 08 '12 at 11:11

2 Answers2

7

This is not necessarily efficient because it creates a sequence of days, but it does the job:

> library(zoo)
> table(as.yearmon(seq(event_start_date, event_end_date, "day")))

Oct 2012 Nov 2012 Dec 2012 Jan 2013 Feb 2013 
       9       30       31       31        7

If your time span is so large than this method is slow, you'll have to create a sequence of firsts of the months between your two (truncated) dates, take the diff, and do a little extra work for the end points.

flodel
  • 87,577
  • 21
  • 185
  • 223
1

As DjSol already pointed out in his comment, you can just subtract two dates to get the number of days:

event_start_date <- as.Date("23/10/2012", "%d/%m/%Y")
event_end_date   <- as.Date("07/02/2013", "%d/%m/%Y")
as.numeric(event_end_date - event_start_date)

Is that what you want? I have the feeling that you might have more of a problem to get the start and end date in such a format so you can easily subtract them because you mention a loop. If so, however, I guess we need more details on how your actual data looks.

Christoph_J
  • 6,804
  • 8
  • 44
  • 58
  • Thank you DjSol and Christoph_J, I am aware of this concept, but I am in particular interested in getting the days allocated to months like in the presented table. Of course this can be done with a loop and month_end - month_start. But I am wondering whether there is a more elegant method of accomplishing that? – Jochem Nov 08 '12 at 11:58
  • My bad! Now I realize what you want to do. But flodel's answer seems to be a good starting point. – Christoph_J Nov 08 '12 at 12:36