Dátumok és időpontok konvertálása karakterláncokba és karakterláncokból Python datetime-ban (strftime, strptime)

Üzleti

A Python szabványos könyvtára datetime dátumokat és időpontokat (dátumok, időpontok és időpontok) dolgozhat fel. A strftime() és strptime() metódusok, amelyek dátumokat és időpontokat konvertálnak karakterláncokká és karakterláncokból, különböző formátumú dátumok és időpontok manipulálására használhatók.

Olyan műveletek elvégzésére is képes, mint a kivonás és az összeadás. Például könnyen kiszámíthatja és megkaphatja a 10 nappal ezelőtti vagy a 3 hét múlva esedékes dátumot, vagy az 50 perc múlva esedékes időt.

Először a datetime modulban elérhető objektumok következő osztályait ismertetjük.

  • datetime.datetime:Dátum és idő (dátum és idő)
  • datetime.date:Dátum
  • datetime.time:Idő
  • datetime.timedelta:Időeltolódás és eltelt idő

A strftime() és strptime() metódusok, amelyek a date\time és a stringet egymáshoz konvertálják, szintén ismertetésre kerülnek.

  • datetimeobjektum
    • datetime.now():Mai dátum, aktuális idő
    • datetimeObjektum konstruktor
    • Egy datetime objektum átalakítása dátum objektummá
  • dateobjektum
    • date.today():A mai dátum
    • Konstruktor a dátum objektumhoz
  • timeobjektum
    • Konstruktor az idő objektumhoz
  • timedeltaobjektum
    • A datetime és date objektumok kivonása timedelta objektumok létrehozásához.
    • A timedelta objektum konstruktora
    • Kivonás és összeadás timedelta objektumokkal
  • strftime():Átalakítás dátumból és időből karakterláncba
  • strptime():Konvertálás karakterláncból dátumra és időre

A szabványos könyvtár része a naptár modul is, amely egyszerű szöveges vagy HTML formátumú naptárakat generál.

datetime objektum

A datetime objektum olyan objektum, amely dátum (év, hónap, nap) és idő (óra, perc, másodperc, mikroszekundum) információkat is tartalmaz. Ezeket az információkat a következő attribútumokkal érheti el.

  • year
  • month
  • day
  • hour
  • minute
  • second
  • microsecond

datetime.now(): Mai dátum, aktuális idő

A datetime.now() egy datetime objektumot ad a mai dátummal (az aktuális dátummal) és az aktuális idővel.

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 a datetime objektumhoz

Lehetőség van tetszőleges dátumok és időpontok datetime objektumainak létrehozására is.

A datetime objektum konstruktora a következő.

datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None)

A következő értékek kötelezőek, a többi elhagyható. Ha elhagyja, az alapértelmezett érték 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

Egy datetime objektum átalakítása dátum objektummá

A datetime objektumot a date() metódussal lehet dátum objektummá alakítani, a következőkben leírtak szerint.

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

dátum objektum

A dátumobjektum olyan objektum, amely egy dátumra (év, hónap, nap) vonatkozó információkat tartalmaz. Az év, a hónap és a nap attribútumokkal érhető el.

date.today(): A mai dátum

Az aktuális dátum (mai dátum) dátumobjektumát a date.today() segítségével kaphatjuk meg.

d_today = datetime.date.today()
print(d_today)
# 2018-02-02

print(type(d_today))
# <class 'datetime.date'>

print(d_today.year)
# 2018

Konstruktor a dátum objektumhoz

A dátum objektum konstruktora a következőképpen néz ki

date(year, month, day)

Mindegyik kötelező és nem hagyható ki.

d = datetime.date(2018, 2, 1)
print(d)
# 2018-02-01

print(d.month)
# 2

időobjektum

Az időobjektum egy olyan objektum, amely az időre vonatkozó információkat (órák, percek, másodpercek és mikroszekundumok) tartalmaz. Az óra, perc, másodperc és mikroszekundum attribútumokkal érhető el.

Konstruktor az idő objektumhoz

A time objektum konstruktora a következő.

time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None)

Ezek mindegyike opcionális, és ha kihagyja őket, akkor 0-ra lesznek beállítva.

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

timedelta objektum

A timedelta objektum egy olyan objektum, amely két dátum és időpont közötti időkülönbséget vagy az eltelt időt jelöli. Napokban, másodpercekben és mikromásodpercekben megadott információkkal rendelkezik, és a napok, másodpercek és mikromásodpercek attribútumokkal érhető el. A total_seconds() metódus segítségével a másodpercek teljes számát is meg lehet kapni.

A datetime és date objektumok kivonása a timedelta objektum létrehozásához.

A datetime objektumok kivonása egymásból egy timedelta objektumot eredményez.

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

A dátumobjektumok egymásból való kivonása hasonlóképpen egy timedelta objektumot eredményez.

A timedelta objektum konstruktora

A timedelta objektum konstruktora a következőképpen néz ki

timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)

Ezek mindegyike opcionális, és ha kihagyja őket, akkor 0-ra lesznek beállítva.

Vegye figyelembe, hogy a timedelta objektum csak a következő információkat tartalmazza.

  • néhány nap: days
  • másodpercek száma: seconds
  • mikroszekundumszámlálás: microseconds

Például a következő kettő egyenlő

  • weeks=1
  • days=7
td_1w = datetime.timedelta(weeks=1)
print(td_1w)
# 7 days, 0:00:00

print(td_1w.days)
# 7

Kivonás és összeadás timedelta objektumokkal

A timedelta objektum a datetime és date objektumokkal együtt használható olyan műveletek elvégzésére, mint a kivonás és az összeadás. Például könnyen kiszámíthatja és megkaphatja az egy héttel ezelőtti vagy a 10 nap múlva esedékes dátumot, illetve az 50 perc múlva esedékes időt.

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

Arra is használható, hogy kiszámolja, hány nap van még egy adott időpontig.

d_target = datetime.date(2020, 7, 24)
td = d_target - d_today
print(td)
# 903 days, 0:00:00

print(td.days)
# 903

strftime(): Átalakítás dátumból és időből karakterláncba

A datetime és date objektumok strftime() metódusa használható a dátum és idő (dátum és idő) adatok bármilyen formátumú karakterlánccá alakítására.

formázási kód

A rendelkezésre álló formázási kódokat lásd az alábbi hivatalos dokumentációban.

A főbb formázási kódok az alábbiakban vannak felsorolva.

  • %d:A hónap napja tizedesjegyekben, nullával kitöltve.
  • %m:Hónap tizedesjegyekben, nullával kitöltve.
  • %y:Az év utolsó két számjegye nullával kitöltött tizedesjegyekkel.
  • %Y:Az év négy számjegye tizedesjegyben, nullával kitöltve.
  • %H:Tizedesjegyekben kifejezve, nullával kitöltve (24 órás jelölés)
  • %I:Tizedesjegyekben kifejezve, nullával kitöltve (12 órás jelölés)
  • %M:A nullával kitöltött tizedesjegyeknél.
  • %S:Másodpercek tizedesjegyekben, nullával kitöltve.
  • %f:Mikromásodpercek (6 számjegy) tizedesjegyekben, 0-val kitöltve.
  • %A:A hét napjának neve a helységben
  • %a:A nap neve a helységben (rövidített formában)
  • %B:Helyi hónap neve
  • %b:Helyi hónap neve (rövidített formában)
  • %j:Az év napja tizedesjegyekben, nullával kitöltve.
  • %U:Az év hetének száma tizedesjegyekkel, nullával kitöltve (a hét vasárnap kezdődik).
  • %W:Az év hetének száma tizedesjegyekben, nullával kitöltve (a hét hétfőn kezdődik)

A nap- és hónapnevek következő formázási kódjai a területi adattól függően különböző karakterláncokban kaphatók.

  • %A
  • %a
  • %B
  • %b

Létezik egy külön módszer az ISO 8601 formátumú karakterláncok számára is.

Minta kód

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

Ha string helyett számot szeretnél kapni, csak konvertáld egész számmá az int() segítségével.

week_num_mon = int(d_today.strftime('%W'))
print(week_num_mon)
print(type(week_num_mon))
# 5
# <class 'int'>

A timedelta objektummal kombinálva könnyen létrehozható például a kéthetenkénti dátumok listája bármilyen formátumban.

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

A listamegértés jelölés használata okosabb.

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(): Konvertálás karakterláncból dátumra és időre

A datetime strptime() segítségével dátum- vagy idősztringből létrehozható egy datetime objektum. Meg kell adni az eredeti karakterláncnak megfelelő formázási karakterláncot.

Létezik egy külön módszer az ISO 8601 karakterláncok számára (Python 3.7 vagy újabb).

Minta kód

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

A strftime() metódus használatával a kinyert datetime objektumon a dátumot és az időt az eredeti karakterlánctól eltérő formátumban is megjelenítheti.

print(date_dt.strftime('%Y-%m-%d %H:%M'))
# 2018-02-01 12:30

Ha datetime objektummá konvertálod, akkor a timedelta objektumokkal is végezhetsz műveleteket, így például egy 10 nappal ezelőtti dátumot tartalmazó karakterláncot generálhatsz ugyanebben a formátumban.

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