如何用Python datetime获取指定日期区间的yyyy-mm-dd格式日期列表
问题描述
我尝试获取两个yyyy-mm-dd格式日期之间的所有日期,编写了如下代码:
from datetime import datetime, timedelta # 补充原代码缺失的导入 def date_range(future_date): date_list = [] current = datetime.strptime(datetime.today().strftime('%Y-%m-%d'), '%Y-%m-%d') end_dt = future_date for n in range(int((end_dt - current).days)+1): d = datetime.strftime(current + timedelta(n), '%Y-%m-%d') d = datetime.strptime(d, '%Y-%m-%d') date_list.append(d) return date_list end_dt = datetime.strptime('2022-08-10', '%Y-%m-%d') print(date_range(end_dt))
但运行后输出不符合预期,得到的结果是:
[datetime.datetime(2022, 7, 20, 0, 0), datetime.datetime(2022, 7, 21, 0, 0), datetime.datetime(2022, 7, 22, 0, 0), datetime.datetime(2022, 7, 23, 0, 0), datetime.datetime(2022, 7, 24, 0, 0), datetime.datetime(2022, 7, 25, 0, 0), datetime.datetime(2022, 7, 26, 0, 0), datetime.datetime(2022, 7, 27, 0, 0), datetime.datetime(2022, 7, 28, 0, 0), datetime.datetime(2022, 7, 29, 0, 0), datetime.datetime(2022, 7, 30, 0, 0), datetime.datetime(2022, 7, 31, 0, 0), datetime.datetime(2022, 8, 1, 0, 0), datetime.datetime(2022, 8, 2, 0, 0), datetime.datetime(2022, 8, 3, 0, 0), datetime.datetime(2022, 8, 4, 0, 0), datetime.datetime(2022, 8, 5, 0, 0), datetime.datetime(2022, 8, 6, 0, 0), datetime.datetime(2022, 8, 7, 0, 0), datetime.datetime(2022, 8, 8, 0, 0), datetime.datetime(2022, 8, 9, 0, 0), datetime.datetime(2022, 8, 10, 0, 0)]
预期输出
['2022-07-20', '2022-07-21',.....,'2022-08-10']
要求仅含日期无时间部分,不想使用pandas,寻求基于datetime模块的解决方案。
解决方案
核心问题是代码中多做了一次strptime转换——把已经转成字符串的日期又转回了datetime对象,导致输出是datetime实例而非字符串格式日期。只需保留字符串格式的结果即可,同时可以优化当前日期的获取逻辑。
修改后的代码如下:
from datetime import datetime, timedelta def date_range(future_date): date_list = [] # 直接获取当前日期的date对象,简化格式转换步骤 current = datetime.today().date() # 兼容传入datetime或date类型的结束日期 end_dt = future_date.date() if isinstance(future_date, datetime) else future_date delta_days = (end_dt - current).days for n in range(delta_days + 1): # 计算日期后直接转为yyyy-mm-dd字符串 d = (current + timedelta(days=n)).strftime('%Y-%m-%d') date_list.append(d) return date_list end_dt = datetime.strptime('2022-08-10', '%Y-%m-%d') print(date_range(end_dt))
也可以用列表推导式简化写法:
from datetime import datetime, timedelta def date_range(future_date): current = datetime.today().date() end_dt = future_date.date() if isinstance(future_date, datetime) else future_date return [(current + timedelta(days=n)).strftime('%Y-%m-%d') for n in range((end_dt - current).days + 1)] end_dt = datetime.strptime('2022-08-10', '%Y-%m-%d') print(date_range(end_dt))
运行后即可得到仅含日期字符串的列表,符合预期输出。
内容的提问来源于stack exchange,提问作者vineet singh
相关产品推荐
相关产品推荐

