Python生成两个日期之间的日期列表

Mai*_*and 24 python dataframe pandas

我想生成两个日期之间的日期列表,并将它们以字符串格式存储在列表中。此列表可用于与我拥有的其他日期进行比较。

我的代码如下:

from datetime import date, timedelta

sdate = date(2019,3,22)   # start date
edate = date(2019,4,9)   # end date

def dates_bwn_twodates(start_date, end_date):
    for n in range(int ((end_date - start_date).days)):
        yield start_date + timedelta(n)
print(dates_bwn_twodates(sdate,edate))
Run Code Online (Sandbox Code Playgroud)

我现在的输出:

<generator object dates_bwn_twodates at 0x000002A8E7929410>
Run Code Online (Sandbox Code Playgroud)

我的预期输出:

['2019-03-22',.....,'2019-04-08']
Run Code Online (Sandbox Code Playgroud)

我的代码有问题。

ank*_*_91 44

您可以pandas.date_range()为此使用:

import pandas
pandas.date_range(sdate,edate-timedelta(days=1),freq='d')
Run Code Online (Sandbox Code Playgroud)
DatetimeIndex(['2019-03-22', '2019-03-23', '2019-03-24', '2019-03-25',
           '2019-03-26', '2019-03-27', '2019-03-28', '2019-03-29',
           '2019-03-30', '2019-03-31', '2019-04-01', '2019-04-02',
           '2019-04-03', '2019-04-04', '2019-04-05', '2019-04-06',
           '2019-04-07', '2019-04-08'],
          dtype='datetime64[ns]', freq='D')
Run Code Online (Sandbox Code Playgroud)

  • @RSJohn 最后尝试 `.strftime('%Y%m%d').tolist()` 。基本上根据您的需要创建日期格式,然后转换为列表,此处的文档:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DatetimeIndex.strftime.html (7认同)
  • @RSJohn 在末尾添加 [`.tolist()`](https://pandas.pydata.org/docs/reference/api/pandas.Index.tolist.html) (5认同)
  • 关于这个答案被标记为“正确”,我唯一的俏皮话是它依赖于 Pandas,这对于解决OP的问题是完全没有必要的。您不需要 pandas 数据处理库来生成两个日期之间的日期列表。下面的glenn15和jagerber48的答案不依赖第三方库,并完成同样的事情。 (4认同)

小智 13

您的代码重写为列表理解:

[sdate+timedelta(days=x) for x in range((edate-sdate).days)]
Run Code Online (Sandbox Code Playgroud)

结果:

[datetime.date(2019, 3, 22),
 datetime.date(2019, 3, 23),
 datetime.date(2019, 3, 24),
          :
 datetime.date(2019, 4, 7),
 datetime.date(2019, 4, 8)]
Run Code Online (Sandbox Code Playgroud)

  • 这太性感了。如果您需要将“edate”包含在列表中,则可以轻松调整,如下所示:“range(((edate + timedelta(days=1))-sdate).days)”。 (5认同)

Jag*_*r48 11

我很惊讶这不是 datetime 包中的标准函数。

这是一个执行请求的函数:

from datetime import timedelta

def date_range_list(start_date, end_date):
    # Return list of datetime.date objects (inclusive) between start_date and end_date (inclusive).
    date_list = []
    curr_date = start_date
    while curr_date <= end_date:
        date_list.append(curr_date)
        curr_date += timedelta(days=1)
    return date_list
Run Code Online (Sandbox Code Playgroud)

用法:

from datetime import date, timedelta

def date_range_list(start_date, end_date):
    # Return list of datetime.date objects (inclusive) between start_date and end_date (inclusive).
    date_list = []
    curr_date = start_date
    while curr_date <= end_date:
        date_list.append(curr_date)
        curr_date += timedelta(days=1)
    return date_list

start_date = date(year=2021, month=12, day=20)
stop_date = date(year=2021, month=12, day=25)
date_list = date_range_list(start_date, stop_date)

date_list
Run Code Online (Sandbox Code Playgroud)

输出:

[datetime.date(2021, 12, 20),
 datetime.date(2021, 12, 21),
 datetime.date(2021, 12, 22),
 datetime.date(2021, 12, 23),
 datetime.date(2021, 12, 24),
 datetime.date(2021, 12, 25)]
Run Code Online (Sandbox Code Playgroud)

更新

虽然上面的代码简单易懂,但最好为列表提供生成器而不是列表本身。这样,除非需要,否则不需要生成整个日期时间数组并将其存储到内存中。该方法如下所示:

from datetime import timedelta

def date_range_list(start_date, end_date):
    # Return generator for a list datetime.date objects (inclusive) between start_date and end_date (inclusive).
    curr_date = start_date
    while curr_date <= end_date:
        yield curr_date 
        curr_date += timedelta(days=1)
Run Code Online (Sandbox Code Playgroud)

用法:

from datetime import date, timedelta

def date_range_list(start_date, end_date):
    # Return generator for a list datetime.date objects (inclusive) between start_date and end_date (inclusive).
    curr_date = start_date
    while curr_date <= end_date:
        yield curr_date 
        curr_date += timedelta(days=1)

start_date = date(year=2021, month=12, day=20)
stop_date = date(year=2021, month=12, day=25)
date_list = date_range_list(start_date, stop_date)

for date in date_list:
   print(date)
Run Code Online (Sandbox Code Playgroud)

输出:

2021-12-20
2021-12-21
2021-12-22
2021-12-23
2021-12-24
2021-12-25
Run Code Online (Sandbox Code Playgroud)


小智 6

from datetime import date, timedelta

sdate = date(2019,3,22)   # start date
edate = date(2019,4,9)   # end date
date_modified=sdate
list=[sdate] 


while date_modified<edate:
    date_modified+=timedelta(days=nbDaysbtw2dates) 
    list.append(date_modified)

print(list) 
Run Code Online (Sandbox Code Playgroud)

  • 当然,需要指定`nbDaysbtw2dates` (2认同)