Jak dowiedzieć się, jaki numer tygodnia jest w bieżącym roku 16 czerwca (wk24) w Pythonie?
python
datetime
week-number
Gerry
źródło
źródło
strftime("%U", d)
może różnić się odisocalendar()
. Na przykład, jeśli zmienisz rok na 2004, otrzymasz 24 tydzień korzystaniastrftime()
i tydzień 25 korzystaniaisocalendar()
.Odpowiedzi:
datetime.date
maisocalendar()
metodę, która zwraca krotkę zawierającą tydzień kalendarzowy:datetime.date.isocalendar () to metoda instancji zwracająca krotkę zawierającą rok, numer tygodnia i dzień tygodnia w odpowiedniej kolejności dla danej instancji daty.
źródło
[1]
” lub wskazał miejsce, gdzie szukać informacji.date(2010, 1, 1).isocalendar()[1]
wraca53
. Z dokumentów: „Na przykład 2004 r. Rozpoczyna się w czwartek, więc pierwszy tydzień roku ISO 2004 rozpoczyna się w poniedziałek, 29 grudnia 2003 r., A kończy w niedzielę, 4 stycznia 2004 r., A więcdate(2003, 12, 29).isocalendar() == (2004, 1, 1)
idate(2004, 1, 4).isocalendar() == (2004, 1, 7)
.”isocalendar()
jest świetne, ale upewnij się, że tego właśnie chcesz. Dzisiaj jest doskonałym przykładem. 01.01.2016 jest równa(2015, 53, 5)
.now.strftime("%W")
inow.strftime("%U")
są równe,00
co jest często tym, czego się chce. PrzykładyNumer tygodnia można uzyskać bezpośrednio z datetime jako ciąg.
Możesz także uzyskać różne „typy” numeru tygodnia w roku, zmieniając
strftime
parametr dla:Dowiedziałem się o tym stąd . Działa dla mnie w Pythonie 2.7.6
źródło
Invalid format string
o tym wzorcu. Ich dokumenty też nie wspominają%V
.%G-%V
zamiast%Y-%V
.%G
jest odpowiednikiem roku ISO%Y
Wierzę, że
date.isocalendar()
to będzie odpowiedź. W tym artykule wyjaśniono matematykę związaną z kalendarzem ISO 8601. Sprawdź część date.isocalendar () strony datetime dokumentacji Pythona..isocalendar () zwraca 3-krotkę z (rok, wk num, wk dzień).
dt.isocalendar()[0]
zwraca rok,dt.isocalendar()[1]
zwraca numer tygodnia,dt.isocalendar()[2]
zwraca dzień tygodnia. Proste, jak może być.źródło
Oto kolejna opcja:
który drukuje
24
.Zobacz: http://docs.python.org/library/datetime.html#strftime-and-strptime-behavior
źródło
Tydzień ISO sugerowany przez innych jest dobry, ale może nie pasować do twoich potrzeb. Zakłada się, że każdy tydzień zaczyna się od poniedziałku, co prowadzi do interesujących anomalii na początku i na końcu roku.
Jeśli wolisz użyć definicji, która mówi, że tydzień 1 to zawsze od 1 stycznia do 7 stycznia, niezależnie od dnia tygodnia, użyj pochodnej w następujący sposób:
źródło
Ogólnie, aby uzyskać numer bieżącego tygodnia (zaczyna się od niedzieli):
źródło
Aby uzyskać wartość całkowitą chwilowego tygodnia w roku, spróbuj:
źródło
Istnieje wiele systemów numerowania tygodni . Oto najczęściej stosowane systemy z przykładami kodu:
ISO : Pierwszy tydzień zaczyna się od poniedziałku i musi zawierać 4 stycznia. Kalendarz ISO jest już zaimplementowany w Pythonie:
North American : Pierwszy tydzień rozpoczyna się w niedzielę i musi zawierać 1 stycznia. Poniższy kod to moja zmodyfikowana wersja implementacji kalendarza ISO Pythona dla systemu w Ameryce Północnej:
źródło
Jeśli używasz tylko numeru tygodnia isocalendar na całym forum, wystarczą następujące informacje:
Pobiera to drugiego członka krotki zwróconej przez isocalendar dla naszego numeru tygodnia.
Jeśli jednak zamierzasz używać funkcji daty, które działają w kalendarzu gregoriańskim, sam izocalendar nie będzie działał! Weź następujący przykład:
Ciąg tutaj mówi, aby zwrócić poniedziałek pierwszego tygodnia 2014 jako naszą datę. Gdy używamy isocalendar do pobrania numeru tygodnia tutaj, spodziewalibyśmy się zwrotu tego samego numeru tygodnia, ale nie robimy tego. Zamiast tego otrzymujemy tygodniowy numer 2. Dlaczego?
Tydzień 1 w kalendarzu gregoriańskim to pierwszy tydzień zawierający poniedziałek. Tydzień 1 w isocalendar to pierwszy tydzień zawierający czwartek. Częściowy tydzień na początku 2014 r. Zawiera czwartek, więc jest to tydzień 1 według isocalendar i tworzenia
date
drugi tydzień.Jeśli chcemy wziąć tydzień gregoriański, musimy przejść z izokalendarza na gregoriański. Oto prosta funkcja, która załatwia sprawę.
źródło
Możesz wypróbować dyrektywę% W jak poniżej:
„% W”: numer tygodnia w roku (poniedziałek jako pierwszy dzień tygodnia) jako liczba dziesiętna. Wszystkie dni w nowym roku poprzedzającym pierwszy poniedziałek uważa się za tydzień 0. (00, 01, ..., 53)
źródło
isocalendar () zwraca niepoprawne wartości roku i numeru tygodnia dla niektórych dat:
Porównaj z podejściem Marka Ransoma:
źródło
Podsumowuję dyskusję na dwa etapy:
datetime
obiekt.datetime
obiektu lubdate
obiektu, aby obliczyć numer tygodnia.Rozgrzać się
`` python
``
1. krok
Aby ręcznie wygenerować
datetime
obiekt, możemy użyćdatetime.datetime(2017,5,3)
lubdatetime.datetime.now()
.Ale w rzeczywistości zwykle musimy przeanalizować istniejący ciąg. możemy użyć
strptime
funkcji, na przykładdatetime.strptime('2017-5-3','%Y-%m-%d')
w której musisz określić format. Szczegółowy kod innego formatu można znaleźć w oficjalnej dokumentacji .Alternatywnie, wygodniejszym sposobem jest użycie modułu dateparse . Przykładami są
dateparser.parse('16 Jun 2010')
,dateparser.parse('12/2/12')
lubdateparser.parse('2017-5-3')
Powyższe dwa podejścia zwrócą
datetime
obiekt.2. krok
Użyj uzyskanego
datetime
obiektu do wywołaniastrptime(format)
. Na przykład,`` python
``
Bardzo trudno jest zdecydować, którego formatu użyć. Lepszym sposobem jest
date
wywołanie obiektuisocalendar()
. Na przykład,`` python
``
W rzeczywistości będziesz bardziej skłonny do
date.isocalendar()
przygotowania cotygodniowego raportu, zwłaszcza w sezonie zakupowym „Boże Narodzenie-Nowy Rok”.źródło
źródło
Podano wiele odpowiedzi, ale chciałbym je dodać.
Jeśli potrzebujesz, aby tydzień był wyświetlany jako styl roku / tygodnia (np. 1953 - 53 tydzień 2019, 2001 - 1 tydzień 2020 itd.), Możesz to zrobić:
Zajmie to bieżący rok i tydzień, a long_week_num w dniu pisania będzie to:
źródło
date()
od zera?datetime.datetime()
instancje mają.date()
metodę dla tego zadania.