Konwersja dat i godzin na i z łańcuchów w Pythonie datetime (strftime, strptime)

Biznes

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:Data
  • datetime.time:Czas
  • datetime.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.

  • datetimeobiekt
    • datetime.now():Dzisiejsza data, aktualny czas
    • datetimeKonstruktor obiektu
    • Konwersja obiektu datetime do obiektu date
  • dateobiekt
    • date.today():Dzisiejsza data
    • Konstruktor dla obiektu daty
  • timeobiekt
    • Konstruktor dla obiektu czasu
  • timedeltaobiekt
    • 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ów
  • strptime():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']

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
Copied title and URL