【问题标题】:Find Max date in the column as per month按月在列中查找最大日期
【发布时间】:2021-04-04 22:43:17
【问题描述】:

有没有办法根据周末在日期列中找到最大日期

df
ColA 
2021-03-12      
2021-03-16      
2021-03-17      
2021-03-24           
2021-03-26      
df
ColA            Max_Date
2021-03-12      2021-03-12 (## Since Mar 12 is the end of week for 2021-03-12 )
2021-03-16      2021-03-19 (## Since Mar 19 is the end of week for 2021-03-16 )
2021-03-17      2021-03-19 (## Since Mar 19 is the end of week for 2021-03-17 )
2021-03-24      2021-03-26 (## Since Mar 26 is the end of week for 2021-03-24 )
2021-03-26      2021-03-26 (## Since Mar 26 is the end of week for 2021-03-26 )

因此,根据周末,填充最大日期

【问题讨论】:

  • lubridate's ceiling_date 应该给你你想要的。更多详情here.

标签: r


【解决方案1】:

1) UNIX Epoch 下面的nextfri 是从https://cran.r-project.org/web/packages/zoo/vignettes/zoo-quickref.pdf 稍微修改的。它接受 Date 或 yyyy-mm-dd 字符串或这些字符串的向量,如果是星期五则返回相同的日期,否则返回下一个星期五的日期。没有使用任何包。

它利用了 UNIX 纪元 1970-01-01 是星期四的事实,因此第二天 1970-01-02 是星期五,如果我们计算周数,包括最后可能的小数周然后,四舍五入到整数周,转换为天并将其添加到 1970-01-02 我们得到下一个星期五或同一天,如果它已经是星期五。如果您加载了 zoo 包,则可以选择省略 origin= 参数。

nextfri <- function(x) 7 * ceiling(as.numeric(as.Date(x)-5+4) / 7) +
  as.Date(5-4, origin = "1970-01-01")

x <- c("2021-03-12", "2021-03-16", "2021-03-17", "2021-03-24", "2021-03-26")
nextfri(x)
## [1] "2021-03-12" "2021-03-19" "2021-03-19" "2021-03-26" "2021-03-26"

2) as.POSIXlt 另一个基本解决方案可以通过考虑我们可以从 as.POSIXlt 获得的当前星期几来构建,然后使用它添加适当的偏移量以到达下周五。

我们取星期五 5 - wday 的差值,然后取模 7,如果它是负数,则加 7。

如果知道所有输入日期都是工作日,我们可以选择省略 %% 7。

as.Date(x) + ((5 - as.POSIXlt(x)$wday) %% 7)
## [1] "2021-03-12" "2021-03-19" "2021-03-19" "2021-03-26" "2021-03-26"

3) cut.Date 可以使用cut.Date 获得另一个基本解决方案。它将给出前一个星期一,因此只需添加 4 即可到达星期五。如果输入日期是星期六或星期日,则将给出上一个星期五,则添加 7。如果已知所有输入日期都是工作日(没有星期六或星期日),则可以选择省略最后一项。

as.Date(cut(as.Date(x), "week")) + 4 + 7 * (as.POSIXlt(x)$wday > 5)
## [1] "2021-03-12" "2021-03-19" "2021-03-19" "2021-03-26" "2021-03-26"

【讨论】:

    【解决方案2】:

    正如已经建议的那样,lubridate::ceiling_date() 非常适合这种情况

    lubridate::ceiling_date(as.Date(df$ColA), unit = "week", 
                            week_start = getOption("lubridate.week.start", 5),
                            change_on_boundary = F)
    
    [1] "2021-03-12" "2021-03-19" "2021-03-19" "2021-03-26" "2021-03-26"
    

    你可以直接存起来

    df$max_date <- lubridate::ceiling_date(as.Date(df$ColA), unit = "week", 
                            week_start = getOption("lubridate.week.start", 5),
                            change_on_boundary = F)
    
    > df
            ColA   max_date
    1 2021-03-12 2021-03-12
    2 2021-03-16 2021-03-19
    3 2021-03-17 2021-03-19
    4 2021-03-24 2021-03-26
    5 2021-03-26 2021-03-26
    

    你的df

    df <- read.table(text = "ColA 
    2021-03-12      
    2021-03-16      
    2021-03-17      
    2021-03-24           
    2021-03-26 ", header = T)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-06
      • 2013-02-15
      • 1970-01-01
      相关资源
      最近更新 更多