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.
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.
Jawaban:
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 .
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
.
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)
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)
Berikut fungsi praktis termasuk masalah dengan nol-minggu.