R语言 计算每年两个日期之间的天数

bn31dyow  于 2023-06-19  发布在  其他
关注(0)|答案(2)|浏览(168)

我有一个数据框架,每行都有开始日期和结束日期。我想计算这两个日期之间的天数,然后按年份分割。所以从这个开始:

id <- c(1,2,3)
start <- as.Date(c('01/01/2015','01/01/2016','07/01/2015'), format = '%m/%d/%Y')
end <- as.Date(c('12/31/2016','12/31/2016','12/31/2016'), format = '%m/%d/%Y')
df <- data.frame(id, start, end)

| id|开始|结束|
| - -----|- -----|- -----|
| 1| 2015年1月1日|2016年12月31日|
| 2| 2016年01月01日|2016年12月31日|
| 3| 2015年07月01日|2016年12月31日|
对此:
| id|开始|结束|天数_编号|2015年|2016年|
| - -----|- -----|- -----|- -----|- -----|- -----|
| 1| 2015年1月1日|2016年12月31日|七百三十|三百六十五|三百六十五|
| 2| 2016年01月01日|2016年12月31日|三百六十五|0|三百六十五|
| 3| 07/01/2015| 2016年12月31日|五百四十八|一百八十三|三百六十五|
任何帮助是赞赏,请注意,我想计算每年的统计动态,我可能结束与许多年列在我的实际情况下...我猜润滑剂可能会有帮助,但我不确定从哪里开始。

sauutmhj

sauutmhj1#

这是一个基本的R选项

transform(
  df,
  days_no = end - start,
  year_2015 = pmax(as.Date("2015-12-31") - start, 0),
  year_2016 = pmax(end - as.Date("2016-1-1"), 0)
)

它给出了

id      start        end  days_no year_2015 year_2016
1  1 2015-01-01 2016-12-31 730 days  364 days  365 days
2  2 2016-01-01 2016-12-31 365 days    0 days  365 days
3  3 2015-07-01 2016-12-31 549 days  183 days  365 days
hc2pp10m

hc2pp10m2#

下面是使用tidyverselubridate的一种方法。
首先,按日历年分隔行,用于测量每年的天数。每一行将包括每个日历年中要计算的日期,从1月1日开始,到12月31日结束,如果重叠多年。然后,很容易计算一年中的天数。
这个例子的结果与我的略有不同。2016年是闰年,有366天。如果天数不包括开始日期或结束日期,则会得到不同的答案。

编辑(6/8/23):根据以下评论,为包含日期添加1。这将给予闰年366天,如2016年,其他年份365天。

library(tidyverse)
library(lubridate)

df %>%
  mutate(date_int = interval(start, end),
         year = map2(year(start), year(end), seq)) %>%
  unnest(year) %>%
  mutate(year_int = interval(as.Date(paste0(year, '-01-01')), as.Date(paste0(year, '-12-31'))),
         year_sect = intersect(date_int, year_int),
         start_new = as.Date(int_start(year_sect)),
         end_new = as.Date(int_end(year_sect))) %>%
  select(id, start_new, end_new) %>%
  mutate(year = year(start_new),
         days = as.numeric(end_new - start_new) + 1) %>%
  right_join(df) %>%
  pivot_wider(id_cols = c(id, start, end), names_from = year, values_from = days, names_prefix = "year_", values_fill = list(days = 0)) %>%
  mutate(days_number = reduce(select(., starts_with("year_")), `+`))

输出

id start      end        year_2015 year_2016 days_number
  <dbl> <date>     <date>         <dbl>     <dbl>       <dbl>
1     1 2015-01-01 2016-12-31       365       366         731
2     2 2016-01-01 2016-12-31         0       366         366
3     3 2015-07-01 2016-12-31       184       366         550

相关问题