Kuupäevade ja kellaaegade teisendamine stringideks ja stringidest Pythoni datetime’is (strftime, strptime)

Äri

Pythoni standardraamatukogu datetime saab kasutada kuupäevade ja kellaaegade (kuupäevade, kellaaegade ja kellaaegade) töötlemiseks. Meetodeid strftime() ja strptime(), mis teisendavad kuupäevad ja kellaajad stringideks ja stringidest, saab kasutada kuupäevade ja kellaaegade manipuleerimiseks erinevates formaatides.

Samuti võib see teha selliseid operatsioone nagu lahutamine ja liitmine. Näiteks saate hõlpsasti arvutada ja saada kuupäeva 10 päeva tagasi või 3 nädala pärast või aega 50 minuti pärast.

Kõigepealt kirjeldame järgmisi datetime-moodulis kättesaadavaid objektiklasse.

  • datetime.datetime:Kuupäev ja kellaaeg (kuupäev ja kellaaeg)
  • datetime.date:Kuupäev
  • datetime.time:Aeg
  • datetime.timedelta:Aegade vahe ja kulunud aeg

Samuti selgitatakse meetodeid strftime() ja strptime(), mis teisendavad date\time ja stringi teineteiseks.

  • datetimeobjekt
    • datetime.now():Tänane kuupäev, praegune kellaaeg
    • datetimeObjekti konstruktor
    • Kuupäeva objekti konverteerimine kuupäeva objektiks
  • dateobjekt
    • date.today():Tänane kuupäev
    • Kuupäeva objekti konstruktor
  • timeobjekt
    • Konstruktor ajaobjekti jaoks
  • timedeltaobjekt
    • Lahutada datetime- ja date-objektid, et luua timedelta-objekte.
    • Konstruktor timedelta objekti jaoks
    • Lahutamine ja liitmine timedelta objektide abil
  • strftime():Konverteerimine kuupäevast ja kellaajast stringiks
  • strptime():Konverteerimine stringist kuupäevaks ja kellaajaks

Standardraamatukogus on ka kalendermoodul, mis genereerib kalendreid tavalises teksti- või HTML-vormingus.

datetime objekt

Datetime-objekt on objekt, mis sisaldab nii kuupäeva (aasta, kuu, päev) kui ka aja (tund, minut, sekund, mikrosekund) teavet. Nendele andmetele pääseb ligi järgmiste atribuutidega.

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

datetime.now(): Tänane kuupäev, praegune kellaaeg

datetime.now() annab sulle datetime-objekti tänase kuupäeva (praeguse kuupäeva) ja praeguse ajaga.

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 datetime objekti jaoks

Samuti on võimalik genereerida datetime-objekte suvaliste kuupäevade ja kellaaegade jaoks.

Datetime-objekti konstruktor on järgmine.

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

Järgmised väärtused on nõutavad ja teised võib ära jätta. Kui need jäetakse välja, on vaikeväärtus 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

Kuupäeva objekti konverteerimine kuupäeva objektiks

Dateetime-objekti saab konverteerida date-objektiks meetodi date() abil, nagu on kirjeldatud allpool.

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

kuupäeva objekt

Kuupäeva objekt on objekt, mis sisaldab teavet kuupäeva kohta (aasta, kuu, päev). Sellele on võimalik ligi pääseda atribuutide aasta, kuu ja päev järgi.

date.today(): Tänane kuupäev

Praeguse kuupäeva (tänase kuupäeva) kuupäevaobjekti saab date.today() abil.

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

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

print(d_today.year)
# 2018

Kuupäeva objekti konstruktor

Kuupäeva objekti konstruktor on järgmine

date(year, month, day)

Kõik on nõutavad ja neid ei saa välja jätta.

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

print(d.month)
# 2

ajaobjekt

Ajaobjekt on objekt, mis sisaldab teavet aja kohta (tunnid, minutid, sekundid ja mikrosekundid). Sellele saab ligi, kasutades atribuute tund, minut, sekund ja mikrosekund.

Konstruktor ajaobjekti jaoks

Ajaobjekti konstruktor on järgmine.

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

Kõik need on valikulised ja kui need jäetakse välja, määratakse neile väärtus 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

timedelta objekt

Objekt timedelta on objekt, mis kujutab kahe kuupäeva ja kellaaja vahelist ajavahet või möödunud aega. See sisaldab teavet päevades, sekundites ja mikrosekundites ning sellele saab juurdepääsu atribuutide days, seconds ja microseconds abil. Samuti on võimalik saada sekundite koguarvu, kasutades meetodit total_seconds().

Subtract datetime ja date objektid, et luua timedelta objekt.

Datetime objektide lahutamisel üksteisest saadakse timedelta objekt.

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

Kuupäeva objektide lahutamine üksteisest annab samamoodi timedelta objekti.

Konstruktor timedelta objekti jaoks

Timedelta objekti konstruktor on järgmine

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

Kõik need on valikulised ja kui need jäetakse välja, määratakse neile väärtus 0.

Pange tähele, et timedelta objekt sisaldab ainult järgmist teavet.

  • mitu päeva: days
  • sekundite arv: seconds
  • mikrosekundite arv: microseconds

Näiteks järgmised kaks on võrdsed

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

print(td_1w.days)
# 7

Lahutamine ja liitmine timedelta objektide abil

Timedelta objekti saab kasutada koos datetime ja date objektidega, et teha selliseid operatsioone nagu lahutamine ja liitmine. Näiteks saab hõlpsasti arvutada ja saada kuupäeva nädal tagasi või 10 päeva pärast või aega 50 minutit pärast praegust.

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

Seda saab kasutada ka konkreetse kuupäevani jäänud päevade arvu arvutamiseks.

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

print(td.days)
# 903

strftime(): Konverteerimine kuupäevast ja kellaajast stringiks

Datetime- ja date-objektide meetodit strftime() saab kasutada kuupäevade ja kellaaegade (kuupäev ja kellaaeg) teisendamiseks mis tahes formaadis stringiks.

vormingu kood

Saadaolevate vormindamiskoodide kohta vt allpool olevat ametlikku dokumentatsiooni.

Peamised vormindamiskoodid on loetletud allpool.

  • %d:Kuu päev kümnendmärgiga ja nulliga täidetud.
  • %m:Kuu kümnendmurdes ja nulliga täidetud.
  • %y:Aasta kaks viimast numbrit nulliga täidetud kümnendmurdes.
  • %Y:Nelja numbriga aastaarv kümnendmurdes ja nulliga täidetud.
  • %H:Väljendatuna kümnendmurdes ja nulliga (24-tunnine märkimine).
  • %I:Väljendatuna kümnendmurdes ja nulliga (12-tunnine märkimine).
  • %M:Nulliga täidetud kümnendmurde puhul.
  • %S:Sekundid kümnendmurdes nulliga täidetud.
  • %f:Mikrosekundid (6-kohaline) kümnendmärgiga, täis 0.
  • %A:Paikuse nädalapäeva nimi
  • %a:Paikuse päeva nimi (lühendatud kujul)
  • %B:Kohaliku kuu nimi
  • %b:Kohaliku kuu nimi (lühendatud kujul)
  • %j:Aasta päev kümnendmurdes nulliga.
  • %U:aasta nädala number kümnendmärgiga nulliga (nädal algab pühapäeval)
  • %W:aasta nädala number kümnendmärgiga nulliga (nädal algab esmaspäeval)

Järgmised päevade ja kuude nimede vormindamise koodid on võimalik saada erinevates stringides sõltuvalt asukohast.

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

Samuti on olemas spetsiaalne meetod ISO 8601 formaadis stringide jaoks.

Näidiskood

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

Kui soovite saada stringi asemel arvu, teisendage see lihtsalt täisarvuks funktsiooniga int().

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

Koos timedelta objektiga on lihtne luua näiteks kahenädalaste kuupäevade loetelu mis tahes formaadis.

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

Loetelu mõistmise märkimisviisi kasutamine on targem.

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(): Konverteerimine stringist kuupäevaks ja kellaajaks

datetime strptime() saab kasutada kuupäevast või kellaaja stringist datetime-objekti loomiseks. Tuleb määrata algsele stringile vastav vormindusstring.

Samuti on olemas spetsiaalne meetod ISO 8601 stringide jaoks (Python 3.7 või uuem).

Näidiskood

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

Kasutades saadud datetime-objektile meetodit strftime(), saab kuupäeva ja kellaaega esitada algsest stringist erinevas formaadis.

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

Kui te teisendate selle datetime-objektiks, saate teha operatsioone ka timedelta-objektidega, nii et saate näiteks genereerida 10 päeva taguse kuupäeva stringi samas formaadis.

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