Xin vui lòng có gì sai với mã của tôi:
import datetime
d = "2013-W26"
r = datetime.datetime.strptime(d, "%Y-W%W")
print(r)
Hiển thị "2013-01-01 00:00:00", Cảm ơn.
Xin vui lòng có gì sai với mã của tôi:
import datetime
d = "2013-W26"
r = datetime.datetime.strptime(d, "%Y-W%W")
print(r)
Hiển thị "2013-01-01 00:00:00", Cảm ơn.
Câu trả lời:
Số tuần không đủ để tạo ngày; bạn cũng cần một ngày trong tuần. Thêm mặc định:
import datetime
d = "2013-W26"
r = datetime.datetime.strptime(d + '-1', "%Y-W%W-%w")
print(r)
Mẫu -1
và -%w
yêu cầu trình phân tích cú pháp chọn thứ Hai trong tuần đó. Kết quả này cho ra:
2013-07-01 00:00:00
%W
sử dụng thứ Hai là ngày đầu tiên trong tuần. Mặc dù bạn có thể chọn ngày trong tuần của riêng mình, nhưng bạn có thể nhận được kết quả không mong đợi nếu đi chệch hướng đó.
Xem phần strftime()
và strptime()
hành vi trong tài liệu, chú thích 4:
Khi được sử dụng với
strptime()
phương pháp,%U
và%W
chỉ được sử dụng trong tính toán khi ngày trong tuần và năm được chỉ định.
Lưu ý, nếu số tuần của bạn là ngày theo tuần ISO , bạn sẽ muốn sử dụng %G-W%V-%u
thay thế! Các lệnh đó yêu cầu Python 3.6 hoặc mới hơn.
if d.endswith('-W0') and r.day == 7: raise ValueError('Invalid date string, No week 0 in {}'.format(r.year))
%G
(năm cho phần lớn hơn trong tuần) và %V
trong trường hợp đó.
Để hoàn thành các câu trả lời khác - nếu bạn đang sử dụng số tuần ISO , thì chuỗi này phù hợp (để lấy thứ Hai của số tuần ISO nhất định):
import datetime
d = '2013-W26'
r = datetime.datetime.strptime(d + '-1', '%G-W%V-%u')
print(r)
%G
, %V
, %u
Được chứng nhận ISO tương đương của %Y
, %W
, %w
, vì vậy kết quả đầu ra này:
2013-06-24 00:00:00
Có sẵn trong Python 3.6+; từ tài liệu .
Trong Python 3.8 có tiện ích datetime.date.fromisocalendar
:
>>> from datetime import date
>>> date.fromisocalendar(2020, 1, 1) # (year, week, day of week)
datetime.date(2019, 12, 30, 0, 0)
Trong các phiên bản Python cũ hơn (3.7-), phép tính có thể sử dụng thông tin từ đó datetime.date.isocalendar
để tìm ra tuần tuân thủ ISO8601 tuần:
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))
Cả hai hoạt động cũng với datetime.datetime
.
import datetime
res = datetime.datetime.strptime("2018 W30 w1", "%Y %W w%w")
print res
Thêm 1 như ngày trong tuần sẽ mang lại bắt đầu tuần hiện tại chính xác. Thêm thời gian (ngày = 6) sẽ cho bạn kết thúc tuần.
datetime.datetime(2018, 7, 23)
res = datetime.datetime.strptime("2018 W30 w1", "%Y W%W w%w")
Trong trường hợp bạn có số tuần trong năm, chỉ cần thêm số tuần vào ngày đầu tiên của năm.
>>> 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)
Đây là một chức năng hữu ích bao gồm vấn đề với số không tuần.