如何生成上周(周一至周日)的日期向量?
生成上周完整日期范围(周一至周日)的解决方案
核心问题是你之前的逻辑只找到了最近的周一,而要得到上周的周一,需要在此基础上再往前推7天,或者先将当前日期回退一周后再定位到周一。下面分几种常用语言给出实现方案:
R 语言实现
方法1:使用lubridate包(推荐)
lubridate处理日期更直观,支持指定周起始为周一:
library(lubridate) # 获取当前日期 today <- Sys.Date() # 先回退1周,再向下取整到当周周一(即上周一) last_monday <- floor_date(today - days(7), unit = "week", week_start = 1) # 生成周一到周日的日期向量 last_week_dates <- seq(last_monday, last_monday + days(6), by = "day") # 输出示例:2023-08-21 至 2023-08-27 print(last_week_dates)
方法2:基础R实现(无需额外包)
通过计算日期的周几偏移量来定位:
today <- Sys.Date() # 基础R中wday返回1=周日,2=周一,...,7=周六 weekday <- as.POSIXlt(today)$wday # 计算上周一:当前日期到最近周一的偏移量 + 额外回退7天 last_monday <- today - (weekday - 2) - 7 # 生成日期序列 last_week_dates <- seq(last_monday, last_monday + 6, by = "day") print(last_week_dates)
Python 语言实现
方法1:使用标准库datetime
from datetime import datetime, timedelta today = datetime.today().date() # 找到最近的周一:weekday()返回0=周一,6=周日,偏移天数为当前周几的数值 recent_monday = today - timedelta(days=today.weekday()) # 上周一 = 最近周一 - 7天 last_monday = recent_monday - timedelta(days=7) # 生成周一到周日的日期列表 last_week_dates = [last_monday + timedelta(days=i) for i in range(7)] # 格式化输出 for date in last_week_dates: print(date.strftime("%Y-%m-%d"))
方法2:使用pandas包(适合数据处理场景)
import pandas as pd from datetime import timedelta today = pd.Timestamp.today().date() # 直接生成上周一为起始的7天日期范围 last_monday = pd.Timestamp(today) - pd.DateOffset(weeks=1, weekday=0) # weekday=0对应周一 last_week_dates = pd.date_range(start=last_monday, periods=7) # 转为字符串列表输出 print(last_week_dates.strftime("%Y-%m-%d").tolist())
关键逻辑说明
你之前的while循环只处理了「回退到最近周一」,但没有考虑要再往前推一周。正确的思路是:
- 先找到最近的周一
- 在此日期基础上减去7天,得到上周一
- 以上周一为起始,生成连续7天的日期序列,就是上周周一至周日的完整范围
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

