Tolong apa yang salah dengan kode saya:
import datetime
d = "2013-W26"
r = datetime.datetime.strptime(d, "%Y-W%W")
print(r)
Tampilkan "2013-01-01 00:00:00", Terima kasih.
Nomor minggu tidak cukup untuk menghasilkan tanggal; Anda juga membutuhkan satu hari dalam seminggu. Tambahkan default:
import datetime
d = "2013-W26"
r = datetime.datetime.strptime(d + '-1', "%Y-W%W-%w")
print(r)
The -1
dan -%w
pola menceritakan parser untuk memilih Senin di minggu itu. Output ini:
2013-07-01 00:00:00
%W
menggunakan hari Senin sebagai hari pertama dalam seminggu. Meskipun Anda dapat memilih hari kerja Anda sendiri, Anda mungkin mendapatkan hasil yang tidak terduga jika Anda menyimpang dari itu.
Lihat bagian strftime()
dan strptime()
perilaku dalam dokumentasi, catatan kaki 4:
Saat digunakan dengan
strptime()
metode,%U
dan%W
hanya digunakan dalam perhitungan saat hari dalam seminggu dan tahun ditentukan.
Perhatikan, jika nomor minggu Anda adalah tanggal minggu ISO , Anda akan ingin menggunakan %G-W%V-%u
sebagai gantinya! Arahan tersebut membutuhkan Python 3.6 atau yang lebih baru.
if d.endswith('-W0') and r.day == 7: raise ValueError('Invalid date string, No week 0 in {}'.format(r.year))
Untuk melengkapi jawaban lainnya - jika Anda menggunakan angka minggu ISO , string ini sesuai (untuk mendapatkan hari Senin dari angka minggu ISO tertentu):
import datetime d = '2013-W26' r = datetime.datetime.strptime(d + '-1', '%G-W%V-%u') print(r)
%G
,%V
,%u
ISO setara dari%Y
,%W
,%w
, sehingga output ini:2013-06-24 00:00:00
Tersedia dengan Python 3.6+; dari dokumen .
sumber
Di Python 3.8 ada yang berguna
datetime.date.fromisocalendar
:>>> from datetime import date >>> date.fromisocalendar(2020, 1, 1) # (year, week, day of week) datetime.date(2019, 12, 30, 0, 0)
Dalam versi Python yang lebih lama (3.7-), penghitungan dapat menggunakan informasi dari
datetime.date.isocalendar
untuk mengetahui minggu minggu yang sesuai dengan 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))
Keduanya bekerja juga dengan
datetime.datetime
.sumber
import datetime res = datetime.datetime.strptime("2018 W30 w1", "%Y %W w%w") print res
Menambahkan 1 sebagai hari kerja akan menghasilkan awal minggu ini yang tepat. Menambahkan timedelta (hari = 6) akan memberi Anda akhir pekan.
datetime.datetime(2018, 7, 23)
sumber
res = datetime.datetime.strptime("2018 W30 w1", "%Y W%W w%w")
Jika Anda memiliki jumlah minggu tahunan, tambahkan saja jumlah minggu pada hari pertama dalam setahun.
>>> 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)
sumber
Berikut fungsi praktis termasuk masalah dengan nol-minggu.
sumber