Hafta numarasından tarih alın


91

Lütfen kodumun nesi var:

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

"2013-01-01 00:00:00" ekranını görüntüleyin, Teşekkürler.

Yanıtlar:


182

Tarih oluşturmak için bir hafta numarası yeterli değildir; haftanın bir gününe de ihtiyacınız var. Varsayılan ekleyin:

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

-1Ve -%wdesen o hafta Pazartesi günü almaya ayrıştırıcı söyler. Bu çıktılar:

2013-07-01 00:00:00

%WPazartesi, haftanın ilk günü olarak kullanılır. Hafta içi gününüzü kendiniz seçebilirken, bundan saparsanız beklenmedik sonuçlar elde edebilirsiniz.

Belgelerdeki strftime()ve strptime()davranış bölümüne bakın , dipnot 4:

strptime()Yöntemle birlikte kullanıldığında %Uve %Wsadece haftanın günü ve yılı belirtildiğinde hesaplamalarda kullanılır.

Hafta numaranız bir ISO hafta tarihiyse , %G-W%V-%ubunun yerine kullanmak isteyeceğinizi unutmayın ! Bu direktifler Python 3.6 veya daha yenisini gerektirir.


2
Çalışmıyor. datetime.datetime.strptime ("2018-W0-0", "% YW% W-% w") == datetime.datetime.strptime ("2018-W1-0", "% YW% W-% w") -> "2018-01-07 00:00:00". 2018'in 1. ve 2. haftası aynı başlangıç ​​tarihine sahiptir.
ozw1z5

2
@ ozw1z5rd: 2018'de 0'ın olmadığı için. 0. Hafta, yılın ilk Pazartesi gününden önceki kısmi haftadır; 2018'de ilk Pazartesi 1 Ocak'tır. Başka bir deyişle, burada sorun girdi dizenizdir , teknik değildir ve Python, W0'ı W1 anlamına gelecek şekilde yorumlamak için hata düzeltmesi yapmıştır.
Martijn Pieters

@ ozw1z5rd: Bu uygulamanız için bir sorunsa, bu tür yıllar için özel durumlara ihtiyacınız olacak; if d.endswith('-W0') and r.day == 7: raise ValueError('Invalid date string, No week 0 in {}'.format(r.year))
Martijn Pieters

Sıfır olmayan doldurulmuş hafta sayılarıyla nasıl başa çıkılacağı hakkında bir fikriniz var mı? (örn. 2020-w1, 2020-w52)
Michael H.

@MichaelH .: Ne sorduğunuzdan emin değilim.
Martijn Pieters

30

Diğer yanıtları tamamlamak için - ISO hafta numaralarını kullanıyorsanız , bu dize uygundur (verilen bir ISO hafta numarasının Pazartesi gününü elde etmek için):

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

%G, %V, %uISO eşdeğerleri olan %Y, %W, %wbu çıkışların böylece:

2013-06-24 00:00:00

Python 3.6+ sürümünde mevcuttur; dan docs .


14

Python 3.8'de kullanışlıdır datetime.date.fromisocalendar:

>>> from datetime import date
>>> date.fromisocalendar(2020, 1, 1)  # (year, week, day of week)
datetime.date(2019, 12, 30, 0, 0)

Eski Python sürümlerinde (3.7-), hesaplama, datetime.date.isocalendarISO8601 ile uyumlu haftaları bulmak için kaynağından alınan bilgileri kullanabilir :

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

Her ikisi de ile çalışır datetime.datetime.


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

Hafta günü olarak 1'in eklenmesi, geçerli hafta başlangıcını tam olarak verecektir. Timedelta (gün = 6) eklemek size hafta sonunu verecektir.

datetime.datetime(2018, 7, 23)

Aşağıdaki gibi olması gereken @Senthikumar Cres = datetime.datetime.strptime("2018 W30 w1", "%Y W%W w%w")
MD Alauddin Al-Amin

Kabul edilen cevabın 2021-01-04 tarihiyle ilgili bir sorunu var, 2020 yılına ait olduğunu söylüyor
ignacio.munizaga

1

Yıllık hafta sayısına sahipseniz, sadece hafta sayısını yılın ilk gününe ekleyin.

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.