如何创建一个新列来指定日期所属的年份范围(如学年)?
Posted
技术标签:
【中文标题】如何创建一个新列来指定日期所属的年份范围(如学年)?【英文标题】:How to create a new column that specifies which range of years a date belongs to (like academic year)? 【发布时间】:2022-01-14 11:04:24 【问题描述】:在某些情况下,“年”不一定从 1 月 1 日开始循环。例如,美国的学年从八月底开始。另一个例子是 NBA 赛季。
我的问题:给定包含日期列的数据,我想创建另一个列来表示它属于哪个时期。例如,假设我们得到以下tib
:
library(lubridate, warn.conflicts = FALSE)
library(tibble)
tib <- tibble(my_dates = as_date(c("1999-01-01", "2010-08-09", "2010-09-02", "1995-03-02")))
tib
#> # A tibble: 4 x 1
#> my_dates
#> <date>
#> 1 1999-01-01
#> 2 2010-08-09
#> 3 2010-09-02
#> 4 1995-03-02
如果学年从 8 月 31 日开始,我们希望更改一个表示每个日期所属学年的列:
desired_output <-
tib %>%
add_column(belongs_to_school_year = c("1998-1999", "2009-2010", "2010-2011", "1994-1995"))
desired_output
#> # A tibble: 4 x 2
#> my_dates belongs_to_school_year
#> <date> <chr>
#> 1 1999-01-01 1998-1999
#> 2 2010-08-09 2009-2010
#> 3 2010-09-02 2010-2011
#> 4 1995-03-02 1994-1995
如何基于my_dates
使用mutate()
创建列belongs_to_school_year
?
【问题讨论】:
【参考方案1】:您可以为此使用dplyr
和lubridate
:
desired_output <- tib %>%
mutate(school_year = case_when(month(my_dates) <= 8 ~ paste(year(my_dates)-1, year(my_dates), sep = "-"),
month(my_dates) > 8 ~ paste(year(my_dates), year(my_dates)+1, sep = "-")))
或:
desired_output <- tib %>%
mutate(school_year = if_else(month(my_dates) <= 8,
paste(year(my_dates)-1, year(my_dates), sep = "-"),
paste(year(my_dates), year(my_dates)+1, sep = "-")))
【讨论】:
谢谢!您能否说明如何将其推广到任意日期(例如 3 月 5 日)? 您可以使用my_dates <= as.Date(paste0(year(my_dates), "-03-05")
,而不是使用month(my_dates) <= 8
。如果您决定使用case_when
,只需在第二种情况下再次将<=
替换为>
,就像以前一样以上是关于如何创建一个新列来指定日期所属的年份范围(如学年)?的主要内容,如果未能解决你的问题,请参考以下文章
Java - 在指定的给定月份 - 年份范围内打印每个月的第一个和最后一个日期