Standardowa biblioteka Pythona datetime może być użyta do przetwarzania dat i czasów (dat, czasów i godzin). Metody strftime() i strptime(), które konwertują daty i godziny na i z łańcuchów, mogą być użyte do manipulowania datami i godzinami w różnych formatach.
Może on również wykonywać operacje takie jak odejmowanie i dodawanie. Na przykład, można łatwo obliczyć i uzyskać datę sprzed 10 dni lub 3 tygodni, lub czas za 50 minut.
Na początek opiszemy następujące klasy obiektów dostępnych w module datetime.
datetime.datetime
:Data i czas (data i czas)datetime.date
:Datadatetime.time
:Czasdatetime.timedelta
:Różnica czasu i czas, który upłynął
Wyjaśnione są również metody strftime() i strptime(), które konwertują czas i ciąg znaków na siebie nawzajem.
datetime
obiektdatetime.now()
:Dzisiejsza data, aktualny czasdatetime
Konstruktor obiektu- Konwersja obiektu datetime do obiektu date
date
obiektdate.today()
:Dzisiejsza data- Konstruktor dla obiektu daty
time
obiekt- Konstruktor dla obiektu czasu
timedelta
obiekt- Odejmowanie obiektów datetime i date w celu utworzenia obiektów timedelta.
- Konstruktor dla obiektu timedelta
- Odejmowanie i dodawanie z wykorzystaniem obiektów timedelta
strftime()
:Konwersja z daty i czasu na ciąg znakówstrptime()
:Konwersja z łańcucha na datę i czas
Do biblioteki standardowej dołączony jest również moduł kalendarza, który generuje kalendarze w formacie zwykłego tekstu lub HTML.
obiekt datetime
Obiekt datetime jest obiektem, który posiada informacje zarówno o dacie (rok, miesiąc, dzień) jak i o czasie (godzina, minuta, sekunda, mikrosekunda). Dostęp do tych informacji można uzyskać przy pomocy następujących atrybutów.
year
month
day
hour
minute
second
microsecond
datetime.now(): Dzisiejsza data, aktualny czas
datetime.now() da ci obiekt datetime z dzisiejszą datą (aktualną datą) i aktualnym czasem.
import datetime
dt_now = datetime.datetime.now()
print(dt_now)
# 2018-02-02 18:31:13.271231
print(type(dt_now))
# <class 'datetime.datetime'>
print(dt_now.year)
# 2018
print(dt_now.hour)
# 18
Konstruktor dla obiektu datetime
Możliwe jest również generowanie obiektów datetime dla dowolnych dat i czasów.
Konstruktor dla obiektu datetime jest następujący.
datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None)
Następujące wartości są wymagane, inne mogą być pominięte. Jeśli zostaną pominięte, domyślną wartością jest 0.
year
month
day
dt = datetime.datetime(2018, 2, 1, 12, 15, 30, 2000)
print(dt)
# 2018-02-01 12:15:30.002000
print(dt.minute)
# 15
print(dt.microsecond)
# 2000
dt = datetime.datetime(2018, 2, 1)
print(dt)
# 2018-02-01 00:00:00
print(dt.minute)
# 0
Konwersja obiektu datetime do obiektu date
Obiekt datetime może zostać przekonwertowany na obiekt date przy pomocy metody date(), jak opisano poniżej.
print(dt_now)
print(type(dt_now))
# 2018-02-02 18:31:13.271231
# <class 'datetime.datetime'>
print(dt_now.date())
print(type(dt_now.date()))
# 2018-02-02
# <class 'datetime.date'>
obiekt daty
Obiekt date jest obiektem, który zawiera informacje o dacie (rok, miesiąc, dzień). Można go udostępnić przy pomocy atrybutów rok, miesiąc i dzień.
date.today(): Dzisiejsza data
Obiekt date bieżącej daty (dzisiejsza data) może być uzyskany przy pomocy date.today().
d_today = datetime.date.today()
print(d_today)
# 2018-02-02
print(type(d_today))
# <class 'datetime.date'>
print(d_today.year)
# 2018
Konstruktor dla obiektu daty
Konstruktor dla obiektu date jest następujący
date(year, month, day)
Wszystkie są wymagane i nie mogą zostać pominięte.
d = datetime.date(2018, 2, 1)
print(d)
# 2018-02-01
print(d.month)
# 2
obiekt czasowy
Obiekt time jest obiektem, który zawiera informacje o czasie (godziny, minuty, sekundy i mikrosekundy). Dostęp do niego można uzyskać przy pomocy atrybutów godzina, minuta, sekunda i mikrosekunda.
Konstruktor dla obiektu czasu
Konstruktor obiektu time jest następujący.
time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None)
Wszystkie z nich są opcjonalne i jeśli zostaną pominięte, są ustawiane na 0.
t = datetime.time(12, 15, 30, 2000)
print(t)
# 12:15:30.002000
print(type(t))
# <class 'datetime.time'>
print(t.hour)
# 12
t = datetime.time()
print(t)
# 00:00:00
obiekt timedelta
Obiekt timedelta jest obiektem, który przedstawia różnicę czasu pomiędzy dwoma datami i czasami lub czas, który upłynął. Posiada informacje w dniach, sekundach i mikrosekundach i można do niego uzyskać dostęp przy pomocy atrybutów days, seconds i microseconds. Możliwe jest również uzyskanie całkowitej liczby sekund za pomocą metody total_seconds().
Odjęcie obiektów datetime i date w celu wytworzenia obiektu timedelta.
Odejmując od siebie obiekty datetime otrzymamy obiekt timedelta.
td = dt_now - dt
print(td)
# 1 day, 18:31:13.271231
print(type(td))
# <class 'datetime.timedelta'>
print(td.days)
# 1
print(td.seconds)
# 66673
print(td.microseconds)
# 271231
print(td.total_seconds())
# 153073.271231
Odejmowanie od siebie obiektów daty podobnie daje obiekt timedelta.
Konstruktor dla obiektu timedelta
Konstruktor obiektu timedelta jest następujący
timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
Wszystkie z nich są opcjonalne i jeśli zostaną pominięte, są ustawiane na 0.
Zauważ, że obiekt timedelta posiada tylko następujące informacje.
- pewną liczbę dni:
days
- liczba sekund:
seconds
- liczenie mikrosekund:
microseconds
Na przykład, następujące dwa są równe
weeks=1
days=7
td_1w = datetime.timedelta(weeks=1)
print(td_1w)
# 7 days, 0:00:00
print(td_1w.days)
# 7
Odejmowanie i dodawanie z wykorzystaniem obiektów timedelta
Obiekt timedelta można stosować z obiektami datetime i date do wykonywania operacji takich jak odejmowanie i dodawanie. Na przykład można w prosty sposób obliczyć i uzyskać datę sprzed tygodnia lub sprzed 10 dni lub czas za 50 minut.
d_1w = d_today - td_1w
print(d_1w)
# 2018-01-26
td_10d = datetime.timedelta(days=10)
print(td_10d)
# 10 days, 0:00:00
dt_10d = dt_now + td_10d
print(dt_10d)
# 2018-02-12 18:31:13.271231
td_50m = datetime.timedelta(minutes=50)
print(td_50m)
# 0:50:00
print(td_50m.seconds)
# 3000
dt_50m = dt_now + td_50m
print(dt_50m)
# 2018-02-02 19:21:13.271231
Może być również używany do obliczania liczby dni do określonej daty.
d_target = datetime.date(2020, 7, 24)
td = d_target - d_today
print(td)
# 903 days, 0:00:00
print(td.days)
# 903
strftime(): Konwersja z daty i czasu na ciąg znaków
Metoda strftime() obiektów datetime i date może być użyta do konwersji informacji o dacie i czasie (data i czas) na ciąg znaków w dowolnym formacie.
kod formatowania
Zobacz oficjalną dokumentację poniżej, aby uzyskać informacje na temat dostępnych kodów formatowania.
Główne kody formatowania są wymienione poniżej.
%d
:Dzień miesiąca w zapisie dziesiętnym z wypełnionym zerem.%m
:Miesiąc w notacji dziesiętnej z wypełnionym zerem.%y
:Dwie ostatnie cyfry roku w notacji dziesiętnej z wypełnieniem zerowym.%Y
:Cztery cyfry roku w zapisie dziesiętnym z wypełnionym zerem.%H
:W przypadku wyrażenia w notacji dziesiętnej z wypełnionym zerem (notacja 24-godzinna)%I
:W przypadku wyrażenia w notacji dziesiętnej z wypełnionym zerem (notacja 12-godzinna)%M
:Dla notacji dziesiętnej z wypełnionym zerem.%S
:Sekundy w notacji dziesiętnej z wypełnionym zerem.%f
:Mikrosekundy (6 cyfr) w zapisie dziesiętnym z wypełnionym 0.%A
:Nazwa dnia tygodnia dla danego locale%a
:Nazwa dnia dla lokalizacji (forma skrócona)%B
:Nazwa miesiąca lokalnego%b
:Nazwa miesiąca lokalnego (w formie skróconej)%j
:Dzień roku w zapisie dziesiętnym z wypełnieniem zerowym.%U
:Numer tygodnia w roku w zapisie dziesiętnym z wypełnieniem zerowym (tydzień zaczyna się w niedzielę)%W
:Numer tygodnia w roku w zapisie dziesiętnym z wypełnieniem zerowym (tydzień zaczyna się w poniedziałek)
Poniższe kody formatowania dla nazw dni i miesięcy można uzyskać w różnych łańcuchach w zależności od locale.
%A
%a
%B
%b
Istnieje również dedykowana metoda dla ciągów w formacie ISO 8601.
Przykładowy kod
print(dt_now.strftime('%Y-%m-%d %H:%M:%S'))
# 2018-02-02 18:31:13
print(d_today.strftime('%y%m%d'))
# 180202
print(d_today.strftime('%A, %B %d, %Y'))
# Friday, February 02, 2018
print('Day number (how many days in a year / January 1 is 001):', d_today.strftime('%j'))
print('Week number (the week starts on Sunday / New Year's Day is 00):', d_today.strftime('%U'))
print('Week number (the week begins on Monday / New Year's Day is 00):', d_today.strftime('%W'))
# Day number (how many days in a year / January 1 is 001): 033
# Week number (the week starts on Sunday / New Year's Day is 00): 04
# Week number (the week begins on Monday / New Year's Day is 00): 05
Jeśli chcesz otrzymać liczbę zamiast łańcucha, po prostu przekonwertuj go na liczbę całkowitą za pomocą int().
week_num_mon = int(d_today.strftime('%W'))
print(week_num_mon)
print(type(week_num_mon))
# 5
# <class 'int'>
W połączeniu z obiektem timedelta można w prosty sposób wytworzyć np. listę dat dwutygodniowych w dowolnym formacie.
d = datetime.date(2018, 2, 1)
td = datetime.timedelta(weeks=2)
n = 8
f = '%Y-%m-%d'
l = []
for i in range(n):
l.append((d + i * td).strftime(f))
print(l)
# ['2018-02-01', '2018-02-15', '2018-03-01', '2018-03-15', '2018-03-29', '2018-04-12', '2018-04-26', '2018-05-10']
print('\n'.join(l))
# 2018-02-01
# 2018-02-15
# 2018-03-01
# 2018-03-15
# 2018-03-29
# 2018-04-12
# 2018-04-26
# 2018-05-10
Używanie notacji list comprehension jest mądrzejsze.
l = [(d + i * td).strftime(f) for i in range(n)]
print(l)
# ['2018-02-01', '2018-02-15', '2018-03-01', '2018-03-15', '2018-03-29', '2018-04-12', '2018-04-26', '2018-05-10']
- Powiązane artykuły:Używanie notacji listy Pythona
strptime(): Konwersja z łańcucha na datę i czas
datetime strptime() może być użyta do utworzenia obiektu datetime z łańcucha daty lub czasu. Konieczne jest określenie łańcucha formatującego odpowiadającego oryginalnemu łańcuchowi.
Istnieje również dedykowana metoda dla ciągów ISO 8601 (Python 3.7 lub nowszy).
Przykładowy kod
date_str = '2018-2-1 12:30'
date_dt = datetime.datetime.strptime(date_str, '%Y-%m-%d %H:%M')
print(date_dt)
# 2018-02-01 12:30:00
print(type(date_dt))
# <class 'datetime.datetime'>
Używając metody strftime() na pobranym obiekcie datetime, możesz przedstawić datę i czas w innym formacie niż oryginalny ciąg znaków.
print(date_dt.strftime('%Y-%m-%d %H:%M'))
# 2018-02-01 12:30
Jeżeli przekonwertujesz go na obiekt datetime, możesz również wykonywać operacje z obiektami timedelta, czyli np. możesz wygenerować łańcuch daty sprzed 10 dni w tym samym formacie.
date_str = '2018-2-1'
date_format = '%Y-%m-%d'
td_10_d = datetime.timedelta(days=10)
date_dt = datetime.datetime.strptime(date_str, date_format)
date_dt_new = date_dt - td_10_d
date_str_new = date_dt_new.strftime(date_format)
print(date_str_new)
# 2018-01-22