如何在Python中获取最近N天、月、年的datetime对象?
解决方案
Python的标准库datetime(配合可选第三方库python-dateutil处理复杂月份/年份偏移)就能满足需求,完全不需要手动操作时间戳(可避免夏令时等时间计算陷阱)。
1. 获取今天之前N天的0点datetime对象
核心思路:先提取当天的日期部分(自动截断时间到0:00),再循环减去timedelta(days=1)生成前N天的日期。
示例代码(N=3,假设今天为2024-11-18):
from datetime import datetime, timedelta today = datetime.today().date() # 仅保留日期,时间默认00:00 n = 3 for i in range(1, n+1): target_date = datetime.combine(today - timedelta(days=i), datetime.min.time()) print(target_date.strftime("%y-%m-%d %H:%M"))
输出:
24-11-17 00:00 24-11-16 00:00 24-11-15 00:00
2. 获取最近N个月的每月第一天0点datetime对象
标准库可手动处理月份跨年逻辑,用第三方库python-dateutil则更简洁,能自动处理边界问题。
方式1:标准库实现
from datetime import datetime today = datetime.today() n = 3 for i in range(n): # 计算目标月份和年份 target_month = today.month - i target_year = today.year if target_month <= 0: target_month += 12 target_year -= 1 # 生成当月第一天0点 target_date = datetime(target_year, target_month, 1) print(target_date.strftime("%y-%m-%d %H:%M"))
方式2:python-dateutil实现(更简洁)
先安装库:pip install python-dateutil
from datetime import datetime from dateutil.relativedelta import relativedelta today = datetime.today() n = 3 for i in range(n): target_date = (today - relativedelta(months=i)).replace(day=1, hour=0, minute=0, second=0, microsecond=0) print(target_date.strftime("%y-%m-%d %H:%M"))
两种方式输出(假设今天为2024-11-18):
24-11-01 00:00 24-10-01 00:00 24-09-01 00:00
3. 获取最近N年的每年第一天0点datetime对象
直接基于当前年份递减,生成每年的1月1日即可:
from datetime import datetime today = datetime.today() n = 3 for i in range(n): target_year = today.year - i target_date = datetime(target_year, 1, 1) print(target_date.strftime("%y-%m-%d %H:%M"))
输出(假设今天为2024-11-18):
24-01-01 00:00 23-01-01 00:00 22-01-01 00:00
关于你提供的代码的问题
用时间戳计算24*60*60的方式存在风险:部分地区夏令时切换会导致当天时长不是24小时,计算出的日期会出现偏差。推荐直接使用datetime和timedelta的组合,这是Python官方推荐的日期时间计算方式,更可靠且可读性更强。
内容的提问来源于stack exchange,提问作者curator
相关产品推荐
相关产品推荐

