R语言如何计算当月已过天数、截至上周六的累计天数
R 两类当月日期统计实现方案
两类统计都可以用基础R实现,无需安装第三方包,也提供lubridate包的简洁写法供参考。
1. 统计当月截至当前日期已过天数
核心逻辑是直接提取日期对象的“日”组分,返回值即为当月已过天数。
- 基础R实现:
# 若要指定基准日期,替换Sys.Date()为对应Date类型对象即可 target_date <- Sys.Date() passed_today <- as.integer(format(target_date, "%d"))
测试:当target_date为as.Date("2024-06-08")时,返回值为8,符合示例要求。
- lubridate包实现:
library(lubridate) passed_today <- day(Sys.Date())
2. 统计当月截至上一个周六的累计天数
核心逻辑是先定位基准日期之前最近的一个周六(若基准日当天为周六,则取基准日本身),再提取该日期的“日”组分即为结果。
- 基础R实现:
target_date <- Sys.Date() # R内置周度规则:周日返回0,周一返回1...周六返回6 wday_val <- as.integer(format(target_date, "%w")) # 计算基准日到上一个周六的时间差 day_diff <- ifelse(wday_val == 6, 0, wday_val + 1) last_sat <- target_date - day_diff passed_last_sat <- as.integer(format(last_sat, "%d"))
测试:当基准日期为as.Date("2024-06-05")时,上一个周六为2024-06-04,返回值为4,符合示例要求。
- lubridate包实现:
library(lubridate) target_date <- Sys.Date() # 设置week_start=1后,周一返回1...周六返回6,周日返回7 wday_val <- wday(target_date, week_start = 1) day_diff <- ifelse(wday_val == 6, 0, wday_val + 1) last_sat <- target_date - days(day_diff) passed_last_sat <- day(last_sat)
注意:所有代码默认以系统当前日期为统计基准,若要统计指定日期的对应值,直接替换
Sys.Date()为目标日期即可。
内容的提问来源于stack exchange,提问作者Jacob Nordstrom
相关产品推荐
相关产品推荐

