【问题标题】:Python generating a list of dates between two datesPython生成两个日期之间的日期列表
【发布时间】:2020-01-23 16:07:20
【问题描述】:

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

我的代码如下:

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))

我现在的输出:

<generator object dates_bwn_twodates at 0x000002A8E7929410>

我的预期输出:

['2019-03-22',.....,'2019-04-08']

我的代码有问题。

【问题讨论】:

  • 使用yield 意味着您的函数将返回一个生成器。如果你想运行生成器来获取所有元素,你可以print(list(dates_bwn_twodates(sdate, edate)))
  • @anky_91 我需要建议。如果我想检查日期是否在上面的列表中?如何与列表进行比较?
  • @Mainland 您的目标是检查某个日期是否介于其他两个日期之间?如果是这样,则该列表是不必要的,并且有更简单的方法来完成该检查
  • @ALollz 是的!目标是拥有一个日期列表(存储在列表中)并比较日期是否已经在列表中。我以为这是唯一的方法。我感谢任何替代解决方案。

标签: python pandas dataframe


【解决方案1】:

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

import pandas
pandas.date_range(sdate,edate-timedelta(days=1),freq='d')

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')

【讨论】:

  • @anky 如果我想获取日期列表为 ['20190322', '20190323',.......],该怎么办?谢谢你:-)
  • @RSJohn 在末尾添加.tolist()
  • @anky 实际上我不希望日期格式中的连字符 (-)。很抱歉不太清楚。
  • @RSJohn 最后尝试.strftime('%Y%m%d').tolist()。基本上根据您的需要创建日期格式,然后转换为列表,文档在这里:pandas.pydata.org/pandas-docs/stable/reference/api/…
【解决方案2】:

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

[sdate+timedelta(days=x) for x in range((edate-sdate).days)]

结果:

[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)]

【讨论】:

    【解决方案3】:

    我很惊讶这不是 datetime 包中的标准功能。

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

    from datetime import timedelta
    
    def date_range_list(start_date, end_date):
        # Return list of datetime.date objects 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
    

    用法:

    from datetime import date, timedelta
    
    def date_range_list(start_date, end_date):
        # Return list of datetime.date objects 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 = datetime.date(year=2021, month=12, day=20)
    stop_date = datetime.date(year=2021, month=12, day=25)
    date_list = date_range_list(start_date, stop_date)
    
    date_list
    

    输出:

    [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)]
    

    【讨论】:

      【解决方案4】:

      有一种更简单的方法,只需修改代码即可使用。 如下;

      from datetime import datetime, timedelta
      from datetime import date
      
      
      def date_bwn_two_dates(start_date, end_date):
          date_list = [] # The list where we want to store
          for i in range(int((end_date-start_date).days)+1): # Iterate between the range of dates
              year = (start_date+timedelta(i)).strftime("%Y") # Get the Year
              month = (start_date+timedelta(i)).strftime("%m") # Get the month
              date_a = (start_date+timedelta(i)).strftime("%d") # Get the day
              date_list.append([year, month, date_a]) # Append the Objects accquired
          return date_list # return the list
      
      
      for i in date_bwn_two_dates(date(2020, 12, 1), date(2021, 12, 1)):
          print(i)
      

      【讨论】:

        【解决方案5】:
        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) 
        

        【讨论】:

        • 当然需要指定nbDaysbtw2dates
        【解决方案6】:

        您需要明确地将其转换为带有字符串的列表:

        print([str(d) for d in dates_bwn_twodates(sdate,edate)])
        

        【讨论】:

          【解决方案7】:

          您可以使用https://github.com/zachwill/moment.git 的时刻库让您的生活更轻松。

          import moment
          
          def dates_bwn_twodates(start_date, end_date):
              diff = abs(start_date.diff(end_date).days)
              
              for n in range(0,diff+1):
                  yield start_date.strftime("%Y-%m-%d")
                  start_date = (start_date).add(days=1)
          
          sdate = moment.date('2019-03-22')   #start date
          edate = moment.date('2019-04-09')   #end date  
          

          然后你就有了选择

          dates = list(dates_bwn_twodates(sdate,edate)) #dates as a list
          

          或者你可以迭代

          for date in dates_bwn_twodates(sdate,edate):
              #do something with each date
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-07-09
            • 1970-01-01
            • 2010-10-05
            • 2016-01-04
            • 2021-09-28
            • 1970-01-01
            相关资源
            最近更新 更多