gpt4 book ai didi

r - 当日期范围跨越日历年的变化时,将行拆分为两行

转载 作者:行者123 更新时间:2023-12-04 10:00:57 25 4
gpt4 key购买 nike

我想弄清楚如何在日期范围跨越一个日历年时添加一行。下面是一个最小的reprex:

我有一个这样的日期框架:

have <- data.frame(
from = c(as.Date('2018-12-15'), as.Date('2019-12-20'), as.Date('2019-05-13')),
to = c(as.Date('2019-06-20'), as.Date('2020-01-25'), as.Date('2019-09-10'))
)
have
#> from to
#> 1 2018-12-15 2019-06-20
#> 2 2019-12-20 2020-01-25
#> 3 2019-05-13 2019-09-10

我想要一个 data.frame,它在 to 时分成两行和 from跨越一个日历年。
want <- data.frame(
from = c(as.Date('2018-12-15'), as.Date('2019-01-01'), as.Date('2019-12-20'), as.Date('2020-01-01'), as.Date('2019-05-13')),
to = c(as.Date('2018-12-31'), as.Date('2019-06-20'), as.Date('2019-12-31'), as.Date('2020-01-25'), as.Date('2019-09-10'))
)
want
#> from to
#> 1 2018-12-15 2018-12-31
#> 2 2019-01-01 2019-06-20
#> 3 2019-12-20 2019-12-31
#> 4 2020-01-01 2020-01-25
#> 5 2019-05-13 2019-09-10

我想这样做是因为对于特定的行,我想知道每年有多少天。
want$time_diff_by_year <- difftime(want$to, want$from)

创建于 2020-05-15 由 reprex package (v0.3.0)

任何基础 R、tidyverse 解决方案都将不胜感激。

最佳答案

您可以使用 map2 确定日期间隔所需的额外年份,然后 unnest为每年创建额外的行。

然后,您可以确定部分年份和完整日历年之间交叉点的日期间隔。这将保留指定年份从 1 月 1 日开始或在 12 月 31 日结束的部分年份。

library(tidyverse)
library(lubridate)

have %>%
mutate(date_int = interval(from, to),
year = map2(year(from), year(to), 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),
from_new = as.Date(int_start(year_sect)),
to_new = as.Date(int_end(year_sect))) %>%
select(from_new, to_new)

输出
# A tibble: 5 x 2
from_new to_new
<date> <date>
1 2018-12-15 2018-12-31
2 2019-01-01 2019-06-20
3 2019-12-20 2019-12-31
4 2020-01-01 2020-01-25
5 2019-05-13 2019-09-10

关于r - 当日期范围跨越日历年的变化时,将行拆分为两行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61828819/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com