【问题标题】:Python Find a day dates between a range of two datesPython在两个日期范围内查找日期
【发布时间】:2019-06-22 14:10:28
【问题描述】:

我正在使用 python3 开发一个项目,在该项目中我必须使用一个 api,并且需要在日期范围内获取一周中特定日期的数据。

因此,示例输入参数为:

firstDay = '1-January-2000'
lastDay = '22-february-2000'
weekDay = 'Monday'

因此,日期将包含在 API 响应中,但当天没有任何信息。因此,我必须在日期范围内获取特定日期的所有日期,例如 Monday

根据上面的例子,我怎样才能得到firstDaylastDay之间的所有Mondays的日期?

【问题讨论】:

    标签: python python-3.x python-datetime python-dateutil


    【解决方案1】:
    from datetime import date, timedelta, datetime
    import time
    
    firstDay = '1-January-2000'
    lastDay = '22-february-2000'
    weekDay = 'Monday'
    
    firstDay = datetime.strptime(firstDay, '%d-%B-%Y') 
    lastDay = datetime.strptime(lastDay, '%d-%B-%Y')
    dates = [firstDay + timedelta(days=x) for x in range((lastDay-firstDay).days + 1) if (firstDay + timedelta(days=x)).weekday() == time.strptime(weekDay, '%A').tm_wday]
    

    输出

    dates
    [datetime.datetime(2000, 1, 3, 0, 0),
     datetime.datetime(2000, 1, 10, 0, 0),
     datetime.datetime(2000, 1, 17, 0, 0),
     datetime.datetime(2000, 1, 24, 0, 0),
     datetime.datetime(2000, 1, 31, 0, 0),
     datetime.datetime(2000, 2, 7, 0, 0),
     datetime.datetime(2000, 2, 14, 0, 0),
     datetime.datetime(2000, 2, 21, 0, 0)]
    
    
    

    weekDay-Month-year 格式的输出

    [d.strftime("%A-%B-%Y") for d in dates] 
    
    ['Monday-January-2000',
     'Monday-January-2000',
     'Monday-January-2000',
     'Monday-January-2000',
     'Monday-January-2000',
     'Monday-February-2000',
     'Monday-February-2000',
     'Monday-February-2000']
    

    firstDay 格式输出:1-January-2000

    [d.strftime("%-d-%B-%Y") for d in dates]   
    ['3-January-2000',
     '10-January-2000',
     '17-January-2000',
     '24-January-2000',
     '31-January-2000',
     '7-February-2000',
     '14-February-2000',
     '21-February-2000']
    

    【讨论】:

    • 我必须使用参数,例如firstDay & lastDay,格式为1-January-2000weekDay作为日期名称。
    • 这里有很棒的列表理解。并使用%B%A... 很棒的pythonic 答案
    • 我怎样才能以firstDay as 1-January-2000 这样的格式生成响应,所以它可以是:weekDay-Month-year
    • 嗨@frankegoesdown,还有另一个问题,这是day 的前导零我可以将01-January-2000 之类的日期设为1-January-2000,因为当天的前导零正在创建一个进一步实施的问题。
    【解决方案2】:

    请试试这个:

    import datetime
    import calendar
    
    def get_all_weekdays_between_range(firstDay, lastDay, weekDay):
        month_name_to_num = {v.lower(): k for k, v in enumerate(calendar.month_name)}
        day_name_to_num = {v.lower(): k for k, v in enumerate(calendar.day_name)}
    
        def parse_date(dateStr):
            parts = dateStr.split('-')
            return datetime.date(int(parts[2]), month_name_to_num[parts[1].lower()], int(parts[0]))
    
        first = parse_date(firstDay)
        last = parse_date(lastDay)
    
        result = []
        current = first
        while current <= last:
            if calendar.weekday(current.year, current.month, current.day) == day_name_to_num[weekDay.lower()]:
                result.append(current)
            current += datetime.timedelta(days=1)
        return result
    
    
    firstDay = '1-January-2000'
    lastDay = '22-february-2000'
    weekDay = 'Monday'
    
    all_days = get_all_weekdays_between_range(firstDay,lastDay,weekDay)
    for day in all_days:
        print(day)
    

    【讨论】:

      【解决方案3】:

      您是否尝试过在 python 中使用 datetime 库,这是一个完美的场景。它包含有关年月日的所有信息,甚至可以计算日期。例如查找两个日期之间的天数。它还可以将日期转换为您想要的任何格式。

      https://docs.python.org/3/library/datetime.html

      这里是您问题的答案

      from datetime import date, timedelta
      dstart = datetime.strptime('1-January-2000', '%d-%B-%Y') 
      dend= datetime.strptime('22-February-2000', '%d-%B-%Y')
      ans = (dend - dstart).days / 7
      if int(ans) + 2/7 <= ans:
          ans = int(ans) + 1
      else:
          ans = int(ans)
      print(ans)
      

      【讨论】:

      • 你计算天数,OP想要得到所有的日期
      猜你喜欢
      • 1970-01-01
      • 2013-05-02
      • 2013-09-09
      • 2016-09-22
      • 2016-10-08
      • 1970-01-01
      • 2017-11-26
      • 2021-08-15
      • 2021-09-07
      相关资源
      最近更新 更多