กรุณามีอะไรผิดพลาดกับรหัสของฉัน:
import datetime
d = "2013-W26"
r = datetime.datetime.strptime(d, "%Y-W%W")
print(r)
แสดง "2013-01-01 00:00:00" ขอบคุณ
กรุณามีอะไรผิดพลาดกับรหัสของฉัน:
import datetime
d = "2013-W26"
r = datetime.datetime.strptime(d, "%Y-W%W")
print(r)
แสดง "2013-01-01 00:00:00" ขอบคุณ
คำตอบ:
จำนวนสัปดาห์ไม่เพียงพอที่จะสร้างวันที่ คุณต้องมีวันในสัปดาห์เช่นกัน เพิ่มค่าเริ่มต้น:
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 หรือใหม่กว่า
if d.endswith('-W0') and r.day == 7: raise ValueError('Invalid date string, No week 0 in {}'.format(r.year))
เพื่อให้คำตอบอื่น ๆ สมบูรณ์ - หากคุณใช้หมายเลขสัปดาห์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.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
ทั้งยังมีการทำงาน
import datetime
res = datetime.datetime.strptime("2018 W30 w1", "%Y %W w%w")
print res
การเพิ่ม 1 เป็นวันของสัปดาห์จะทำให้เกิดการเริ่มต้นสัปดาห์ปัจจุบันที่แน่นอน การเพิ่ม timedelta (วัน = 6) จะทำให้คุณสิ้นสุดสัปดาห์
datetime.datetime(2018, 7, 23)
res = datetime.datetime.strptime("2018 W30 w1", "%Y W%W w%w")
ในกรณีที่คุณมีจำนวนสัปดาห์ประจำปีให้เพิ่มจำนวนสัปดาห์ในวันแรกของปี
>>> 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)
นี่คือฟังก์ชั่นที่มีประโยชน์รวมถึงปัญหาเกี่ยวกับศูนย์สัปดาห์