两个日期之间的每月天数

时间:2016-12-28 10:29:13

标签: r lubridate

diff(seq(as.Date("2016-12-21"), as.Date("2017-04-05"), by="month"))
Time differences in days
[1] 31 31 28

以上代码在12月,1月和2月的月份中没有产生任何天数。 但是,我的要求如下

#Results that I need
#monthly days from date 2016-12-21 to 2017-04-05 
11, 31, 28, 31, 5
#i.e 11 days of Dec, 31 of Jan, 28 of Feb, 31 of Mar and 5 days of Apr.

我甚至尝试days_in_month lubridate但未能达到结果

library(lubridate)    
days_in_month(c(as.Date("2016-12-21"), as.Date("2017-04-05")))
Dec Apr 
 31  30 

2 个答案:

答案 0 :(得分:3)

试试这个:

x = rle(format(seq(as.Date("2016-12-21"), as.Date("2017-04-05"), by=1), '%b'))

> setNames(x$lengths, x$values)
# Dec Jan Feb Mar Apr 
#  11  31  28  31   5 

答案 1 :(得分:1)

虽然我们已经看到table明确替换rle和纯table解决方案,但我想使用分组添加两种方法。所有方法的共同之处在于,它们在两个给定日期之间创建了一系列天数,并按月以不同方式汇总。

aggregate()

这个使用基础R:

# create sequence of days
days <- seq(as.Date("2016-12-21"), as.Date("2017-04-05"), by = 1)
# aggregate by month
aggregate(days, list(month = format(days, "%b")), length)
#  month  x
#1   Apr  5
#2   Dez 11
#3   Feb 28
#4   Jan 31
#5   Mrz 31

不幸的是,这些月份按字母顺序排列,就像简单的table()方法一样。在这些情况下,我更喜欢ISO8601明确命名月份的方式:

aggregate(days, list(month = format(days, "%Y-%m")), length)
#    month  x
#1 2016-12 11
#2 2017-01 31
#3 2017-02 28
#4 2017-03 31
#5 2017-04  5

data.table

现在我已经习惯了data.table语法,这是我首选的方法:

library(data.table)
data.table(days)[, .N, .(month = format(days, "%b"))]
#   month  N
#1:   Dez 11
#2:   Jan 31
#3:   Feb 28
#4:   Mrz 31
#5:   Apr  5

保留月份的顺序,因为它们出现在输入向量中。