รับวันที่จากหมายเลขสัปดาห์


คำตอบ:


183

จำนวนสัปดาห์ไม่เพียงพอที่จะสร้างวันที่ คุณต้องมีวันในสัปดาห์เช่นกัน เพิ่มค่าเริ่มต้น:

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

-1และ-%wรูปแบบการบอก parser ที่จะเลือกวันจันทร์ในสัปดาห์นั้น ผลลัพธ์นี้:

2013-07-01 00:00:00

%Wใช้วันจันทร์เป็นวันแรกของสัปดาห์ แม้ว่าคุณจะเลือกวันธรรมดาได้ แต่คุณอาจได้รับผลลัพธ์ที่ไม่คาดคิดหากเบี่ยงเบนไปจากนั้น

ดูส่วนพฤติกรรมstrftime()และstrptime()พฤติกรรมในเอกสารเชิงอรรถ 4:

เมื่อใช้กับstrptime()วิธีนี้%Uและ%Wจะใช้ในการคำนวณเมื่อระบุวันในสัปดาห์และปีเท่านั้น

โปรดทราบว่าหากหมายเลขสัปดาห์ของคุณเป็นวันที่ ISO weekคุณจะต้องใช้%G-W%V-%uแทน! คำสั่งเหล่านั้นต้องการ Python 3.6 หรือใหม่กว่า


2
ไม่ทำงาน, ไม่เป็นผล. datetime.datetime.strptime ("2018-W0-0", "% YW% W-% w") == datetime.datetime.strptime ("2018-W1-0", "% YW% W-% w") -> "2018-01-07 00:00:00" สัปดาห์ที่ 1 และ 2 ของปี 2018 มีวันที่เริ่มต้นเดียวกัน
ozw1z5rd

2
@ ozw1z5rd: นั่นเป็นเพราะไม่มีสัปดาห์ที่ 0 ในปี 2018 สัปดาห์ที่ 0 คือสัปดาห์บางส่วนก่อนวันจันทร์แรกของปี ในปี 2018 วันจันทร์แรกคือวันที่ 1 มกราคม กล่าวอีกนัยหนึ่งสตริงอินพุตของคุณคือปัญหาที่นี่ไม่ใช่เทคนิคและ Python ได้รับการแก้ไขข้อผิดพลาดในการตีความ W0 เป็นหมายถึง W1 แทน
Martijn Pieters

@ ozw1z5rd: หากนี่เป็นปัญหาสำหรับแอปของคุณคุณจะต้องใช้เวลาเป็นกรณีพิเศษ if d.endswith('-W0') and r.day == 7: raise ValueError('Invalid date string, No week 0 in {}'.format(r.year))
Martijn Pieters

มีความคิดอย่างไรในการจัดการกับตัวเลขสัปดาห์ที่ไม่ใช่ศูนย์ (เช่น 2020-w1, 2020-w52)
Michael H.

@MichaelH: ฉันไม่แน่ใจว่าคุณกำลังถามอะไร
Martijn Pieters

30

เพื่อให้คำตอบอื่น ๆ สมบูรณ์ - หากคุณใช้หมายเลขสัปดาห์ISOสตริงนี้เหมาะสม (เพื่อรับวันจันทร์ของหมายเลขสัปดาห์ ISO ที่กำหนด):

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

%G, %V, %uมีเทียบเท่า ISO ของ%Y, %W, %wดังนั้นผลนี้:

2013-06-24 00:00:00

มีให้ใน Python 3.6+; จากเอกสาร


14

ใน 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ทั้งยังมีการทำงาน


7
import datetime
res = datetime.datetime.strptime("2018 W30 w1", "%Y %W w%w")
print res

การเพิ่ม 1 เป็นวันของสัปดาห์จะทำให้เกิดการเริ่มต้นสัปดาห์ปัจจุบันที่แน่นอน การเพิ่ม timedelta (วัน = 6) จะทำให้คุณสิ้นสุดสัปดาห์

datetime.datetime(2018, 7, 23)

@Senthikumar C ที่ควรจะเป็นเช่นด้านล่างres = datetime.datetime.strptime("2018 W30 w1", "%Y W%W w%w")
MD Alauddin Al-Amin

คำตอบที่ได้รับการยอมรับมีปัญหากับวันที่ 2021-01-04 โดยระบุว่าเป็นของปี 2020
ignacio.munizaga

1

ในกรณีที่คุณมีจำนวนสัปดาห์ประจำปีให้เพิ่มจำนวนสัปดาห์ในวันแรกของปี

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.