为了账号安全,请及时绑定邮箱和手机立即绑定

在Python中迭代一系列日期

在Python中迭代一系列日期

慕桂英3389331 2019-07-03 13:50:50
在Python中迭代一系列日期我有下面的代码来完成这个任务,但是如何才能做得更好呢?现在,我认为它比嵌套循环更好,但是当您在列表理解中有一个生成器时,它就开始得到Perl-一行代码。day_count = (end_date - start_date).days + 1for single_date in [d for d in (start_date + timedelta(n) for n in range(day_count))  if d <= end_date]:     print strftime("%Y-%m-%d", single_date.timetuple())注记我不是用这个来打印的。那只是为了演示。这个start_date和end_date变量是datetime.date对象,因为我不需要时间戳。(它们将用于生成报告)。样本输出开始日期2009-05-30和结束日期2009-06-09:2009-05-302009-05-312009-06-012009-06-022009-06-032009-06-042009-06-052009-06-062009-06-072009-06-082009-06-09
查看完整描述

5 回答

?
慕少森

TA贡献2019条经验 获得超9个赞

为什么有两个嵌套迭代?对我来说,它只使用一个迭代生成相同的数据列表:

for single_date in (start_date + timedelta(n) for n in range(day_count)):
    print ...

没有列表被存储,只有一个生成器被迭代。此外,生成器中的“if”似乎没有必要。

毕竟,线性序列只需要一个迭代器,而不是两个迭代器。

与John Machin讨论后的最新情况:

也许最优雅的解决方案是使用生成器函数来完全隐藏/抽象日期范围内的迭代:

from datetime import timedelta, datedef daterange(start_date, end_date):
    for n in range(int ((end_date - start_date).days)):
        yield start_date + timedelta(n)start_date = date(2013, 1, 1)end_date = date(2015, 6, 2)
        for single_date in daterange(start_date, end_date):
    print single_date.strftime("%Y-%m-%d")

注意:为了与内置的range()函数此迭代停止。以前到达end_date..因此,对于包含性迭代,请在第二天使用,就像您在range().


查看完整回答
反对 回复 2019-07-03
?
慕标5832272

TA贡献1966条经验 获得超4个赞

这一点可能更清楚:

d = start_date
delta = datetime.timedelta(days=1)while d <= end_date:
    print d.strftime("%Y-%m-%d")
    d += delta


查看完整回答
反对 回复 2019-07-03
?
眼眸繁星

TA贡献1873条经验 获得超9个赞

使用dateutil图书馆:

from datetime import datefrom dateutil.rrule import rrule, DAILY

a = date(2009, 5, 30)b = date(2009, 6, 9)for dt in rrule(DAILY, dtstart=a, until=b):
    print dt.strftime("%Y-%m-%d")

这个python库有许多更高级的特性,有些非常有用,例如relative delta并且被实现为一个很容易包含到项目中的单一文件(模块)。


查看完整回答
反对 回复 2019-07-03
  • 5 回答
  • 0 关注
  • 701 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信