【问题标题】:Get date from week number从周数获取日期
【发布时间】:2013-06-13 12:39:50
【问题描述】:

请问我的代码有什么问题:

import datetime
d = "2013-W26"
r = datetime.datetime.strptime(d, "%Y-W%W")
print(r)

显示“2013-01-01 00:00:00”,谢谢。

【问题讨论】:

    标签: python datetime strptime


    【解决方案1】:

    周数不足以生成日期;你也需要一周中的一天。添加默认值:

    import datetime
    d = "2013-W26"
    r = datetime.datetime.strptime(d + '-1', "%Y-W%W-%w")
    print(r)
    

    -1-%w 模式告诉解析器选择该周的星期一。这输出:

    2013-07-01 00:00:00
    

    %W 使用星期一作为一周的第一天。虽然您可以选择自己的工作日,但如果您偏离该日期,您可能会得到意想不到的结果。

    请参阅文档中的 strftime() and strptime() behaviour 部分,脚注 4:

    当与strptime() 方法一起使用时,%U%W 仅在指定星期几和年份的计算中使用。

    请注意,如果您的周数是 ISO week date,则您需要改用 %G-W%V-%u!这些指令需要 Python 3.6 或更高版本。

    【讨论】:

    • 不起作用。 datetime.datetime.strptime("2018-W0-0", "%YW%W-%w") == datetime.datetime.strptime("2018-W1-0", "%YW%W-%w") -->“2018-01-07 00:00:00”。 2018 年第一周和第二周的开始日期相同。
    • @ozw1z5rd:那是因为 2018 年没有第 0 周。第 0 周是一年中第一个星期一之前的部分周; 2018 年的第一个星期一是 1 月 1 日。换句话说,您的输入字符串是这里的问题,而不是技术,并且 Python 已纠错以将 W0 解释为 W1。
    • @ozw1z5rd:如果这对您的应用来说是个问题,那么您需要对这样的年份进行特殊处理; if d.endswith('-W0') and r.day == 7: raise ValueError('Invalid date string, No week 0 in {}'.format(r.year))
    • 知道如何处理非零填充周数吗? (例如 2020-w1、2020-w52)
    • @MichaelH.:我不确定你在问什么。
    【解决方案2】:

    要完成其他答案 - 如果您使用 ISO 周数,则此字符串是合适的(获取给定 ISO 周数的星期一):

    import datetime
    d = '2013-W26'
    r = datetime.datetime.strptime(d + '-1', '%G-W%V-%u')
    print(r)
    

    %G%V%u%Y%W%w 的 ISO 等效项,因此输出:

    2013-06-24 00:00:00
    

    在 Python 3.6+ 中可用;来自docs

    【讨论】:

      【解决方案3】:

      在 Python 3.8 中有方便的 datetime.date.fromisocalendar:

      >>> from datetime import date
      >>> date.fromisocalendar(2020, 1, 1)  # (year, week, day of week)
      datetime.date(2019, 12, 30, 0, 0)
      

      在较旧的 Python 版本 (3.7-) 中,计算可以使用来自 datetime.date.isocalendar 的信息来计算符合 ISO8601 的周数:

      from datetime import date, timedelta
      
      def monday_of_calenderweek(year, week):
          first = date(year, 1, 1)
          base = 1 if first.isocalendar()[1] == 1 else 8
          return first + timedelta(days=base - first.isocalendar()[2] + 7 * (week - 1))
      

      两者都适用于datetime.datetime

      【讨论】:

        【解决方案4】:
        import datetime
        res = datetime.datetime.strptime("2018 W30 w1", "%Y %W w%w")
        print res
        

        添加 1 作为工作日将产生准确的当前周开始。添加 timedelta(days=6) 将为您提供周末。

        datetime.datetime(2018, 7, 23)
        

        【讨论】:

        • @Senthikumar C 应该像下面的res = datetime.datetime.strptime("2018 W30 w1", "%Y W%W w%w")
        • 接受的答案是2021-01-04的日期有问题,它说它属于2020年
        【解决方案5】:

        如果您有每年的周数,只需将周数添加到一年的第一天。

        >>> import datetime
        >>> from dateutil.relativedelta import relativedelta
        
        >>> week = 40
        >>> year = 2019
        >>> date = datetime.date(year,1,1)+relativedelta(weeks=+week)
        >>> date
        datetime.date(2019, 10, 8)
        

        【讨论】:

          【解决方案6】:

          如果有人正在寻找一个简单的函数,它可以返回一周数中的所有工作日(周一至周五)日期,请考虑这个(基于 accepted answer

          import datetime
          
          def weeknum_to_dates(weeknum):
              return [datetime.datetime.strptime("2021-W"+ str(weeknum) + str(x), "%Y-W%W-%w").strftime('%d.%m.%Y') for x in range(-5,0)]
          
          weeknum_to_dates(37)
          

          输出:

          ['17.09.2021', '16.09.2021', '15.09.2021', '14.09.2021', '13.09.2021']
          

          【讨论】:

            【解决方案7】:

            这是一个handy function,包括零周问题。

            【讨论】:

              猜你喜欢
              • 2010-11-19
              • 2017-08-09
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-06-29
              相关资源
              最近更新 更多