如何创建一个新列来指定日期所属的年份范围(如学年)?

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】:

您可以为此使用dplyrlubridate

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 &lt;= as.Date(paste0(year(my_dates), "-03-05"),而不是使用month(my_dates) &lt;= 8。如果您决定使用case_when,只需在第二种情况下再次将&lt;= 替换为&gt;,就像以前一样

以上是关于如何创建一个新列来指定日期所属的年份范围(如学年)?的主要内容,如果未能解决你的问题,请参考以下文章

Java - 在指定的给定月份 - 年份范围内打印每个月的第一个和最后一个日期

从列中提取日期并在 R 中缺少年份时添加年份

如何在 swiftUI 中创建仅选择年份的 DatePicker,并且我希望它在预先指定的年份范围内?

如何从sql中经过的天数中查找年份和月份

如何在 Pandas 中选择行范围?

如何使用 df 中的多个列来运行多个条件来计算新列? [复制]