Päivämäärien ja kellonaikojen muuntaminen merkkijonoiksi ja merkkijonoista Pythonissa datetime (strftime, strptime)

liiketoiminta

Pythonin standardikirjastossa datetimea voidaan käyttää päivämäärien ja kellonaikojen (päivämäärät, kellonajat ja kellonajat) käsittelyyn. Metodeja strftime() ja strptime(), jotka muuttavat päivämääriä ja kellonaikoja merkkijonoiksi ja merkkijonoista, voidaan käyttää päivämäärien ja kellonaikojen käsittelyyn eri muodoissa.

Se voi myös suorittaa operaatioita, kuten vähennyslaskun ja yhteenlaskun. Voit esimerkiksi helposti laskea ja saada päivämäärän 10 päivää sitten tai 3 viikon päästä tai kellonajan 50 minuutin päästä.

Aluksi kuvataan seuraavat datetime-moduulissa käytettävissä olevat objektiluokat.

  • datetime.datetime:Päivämäärä ja kellonaika (päivämäärä ja kellonaika)
  • datetime.date:Päivämäärä
  • datetime.time:Aika
  • datetime.timedelta:Aikaero ja kulunut aika

Lisäksi selitetään metodit strftime() ja strptime(), jotka muuttavat date\time- ja string-merkkijonot toisiinsa.

  • datetimekohde
    • datetime.now():Tämän päivän päivämäärä, nykyinen kellonaika
    • datetimeObjektin rakentaja
    • Datetime-olion muuntaminen date-olioksi
  • datekohde
    • date.today():Tämän päivän päivämäärä
    • Päivämääräobjektin konstruktori
  • timekohde
    • Aikaobjektin konstruktori
  • timedeltakohde
    • Vähennä datetime- ja date-objekteja luodaksesi timedelta-objekteja.
    • Konstruktori timedelta-objektille
    • Vähennyslasku ja yhteenlasku timedelta-objekteja käyttäen
  • strftime():Päivämäärän ja kellonajan muuntaminen merkkijonoksi
  • strptime():Muunnos merkkijonosta päivämääräksi ja kellonajaksi

Vakiokirjastoon kuuluu myös kalenterimoduuli, joka luo kalentereita tavallisen tekstin tai HTML-muodossa.

datetime-objekti

Datetime-objekti on objekti, joka sisältää sekä päivämäärä- (vuosi, kuukausi, päivä) että aikatiedot (tunti, minuutti, sekunti, mikrosekunti). Voit käyttää näitä tietoja seuraavien attribuuttien avulla.

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

datetime.now(): Tämän päivän päivämäärä, nykyinen kellonaika

datetime.now() antaa sinulle datetime-olion, jossa on tämän päivän päivämäärä (nykyinen päivämäärä) ja nykyinen aika.

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

Konstruktori datetime-objektille

On myös mahdollista luoda datetime-objekteja mielivaltaisille päivämäärille ja kellonajoille.

Datetime-olion konstruktori on seuraava.

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

Seuraavat arvot ovat pakollisia, ja muut voidaan jättää pois. Jos ne jätetään pois, oletusarvo on 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

Datetime-olion muuntaminen date-olioksi

Datetime-olio voidaan muuntaa date-olioksi date()-metodilla, kuten seuraavassa kuvataan.

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

päivämäärä objekti

Päiväysobjekti on objekti, joka sisältää tietoja päivämäärästä (vuosi, kuukausi, päivä). Sitä voidaan käyttää attribuuttien vuosi, kuukausi ja päivä avulla.

date.today(): Tämän päivän päivämäärä

Nykyisen päivämäärän (tämän päivän päivämäärän) päivämääräobjekti saadaan käyttämällä 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

Päivämääräobjektin konstruktori

Päivämääräobjektin konstruktori on seuraava

date(year, month, day)

Kaikki ovat pakollisia, eikä niitä voi jättää pois.

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

print(d.month)
# 2

aika objekti

Time-objekti on objekti, joka sisältää tietoa ajasta (tunnit, minuutit, sekunnit ja mikrosekunnit). Sitä voidaan käyttää attribuuttien tunti, minuutti, sekunti ja mikrosekunti avulla.

Aikaobjektin konstruktori

Time-olion konstruktori on seuraava.

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

Kaikki ne ovat valinnaisia, ja jos ne jätetään pois, niiden arvoksi asetetaan 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-objekti

timedelta-olio on objekti, joka edustaa kahden päivämäärän ja kellonajan välistä aikaeroa tai kulunutta aikaa. Se sisältää tietoja päivinä, sekunteina ja mikrosekunteina, ja sitä voidaan käyttää attribuuttien days, seconds ja microseconds avulla. Myös sekuntien kokonaismäärä on mahdollista saada total_seconds()-metodilla.

Vähennä datetime- ja date-objektit luodaksesi timedelta-objektin.

Kun datetime-oliot vähennetään toisistaan, saadaan timedelta-olio.

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

Päiväysobjektien vähentäminen toisistaan tuottaa samalla tavalla timedelta-objektin.

Konstruktori timedelta-objektille

Timedelta-olion konstruktori on seuraava.

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

Kaikki ne ovat valinnaisia, ja jos ne jätetään pois, niiden arvoksi asetetaan 0.

Huomaa, että timedelta-objekti sisältää vain seuraavat tiedot.

  • useita päiviä: days
  • sekuntien määrä: seconds
  • mikrosekunnin laskenta: microseconds

Esimerkiksi seuraavat kaksi ovat yhtä suuria

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

print(td_1w.days)
# 7

Vähennyslasku ja yhteenlasku timedelta-objekteja käyttäen

Timedelta-objektia voidaan käyttää datetime- ja date-objektien kanssa sellaisten operaatioiden suorittamiseen kuin vähennyslasku ja yhteenlasku. Voit esimerkiksi helposti laskea ja saada päivämäärän viikon takaa tai 10 päivän päästä tai kellonajan 50 minuutin päästä.

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

Sitä voidaan käyttää myös laskemaan tiettyyn päivämäärään jäljellä olevien päivien määrä.

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

print(td.days)
# 903

strftime(): Päivämäärän ja kellonajan muuntaminen merkkijonoksi

Datetime- ja date-objektien strftime()-metodilla voidaan muuntaa päivämäärä- ja aikatiedot (päivämäärä ja kellonaika) missä tahansa muodossa olevaksi merkkijonoksi.

muotoilukoodi

Katso käytettävissä olevat muotoilukoodit alla olevasta virallisesta dokumentaatiosta.

Tärkeimmät muotoilukoodit luetellaan jäljempänä.

  • %d:Kuukauden päivä desimaalilukuna nollalla täytettynä.
  • %m:Kuukausi desimaalilukuna nollalla täytettynä.
  • %y:Vuoden kaksi viimeistä numeroa nollalla täytettynä desimaalilukuna.
  • %Y:Neljä vuosilukua desimaalilukuna nollalla täytettynä.
  • %H:Ilmaistuna desimaalilukuna, jossa on nolla (24 tunnin merkintä).
  • %I:Ilmaistuna desimaalilukuna nollalla täytettynä (12 tunnin merkintä)
  • %M:Desimaalimerkintä, jossa nolla täytetään.
  • %S:Sekunnit desimaalilukuna nollalla täytettynä.
  • %f:Mikrosekunnit (6 numeroa) desimaalilukuna, jossa 0 on täytetty.
  • %A:Paikkakunnan viikonpäivän nimi
  • %a:Paikkakunnan päivän nimi (lyhennetty muoto).
  • %B:Paikkakunnan kuukauden nimi
  • %b:Paikkakunnan kuukauden nimi (lyhennetty muoto)
  • %j:Vuoden päivä desimaalilukuna nollatäytöllä.
  • %U:Vuoden viikkonumero desimaalilukuna nollatäytöllä (viikko alkaa sunnuntaina)
  • %W:Vuoden viikkonumero desimaalilukuna nollatäytöllä (viikko alkaa maanantaina)

Seuraavat päivien ja kuukausien nimien muotoilukoodit voidaan saada eri merkkijonoina alueesta riippuen.

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

Myös ISO 8601 -muotoisille merkkijonoille on oma menetelmänsä.

Esimerkkikoodi

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

Jos haluat saada numeron merkkijonon sijasta, muunna se kokonaisluvuksi funktiolla int().

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

Yhdessä timedelta-objektin kanssa on helppo luoda esimerkiksi luettelo kahden viikon välein toistuvista päivämääristä missä tahansa muodossa.

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

Luettelon ymmärtämisen merkintätapa on fiksumpi.

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(): Muunnos merkkijonosta päivämääräksi ja kellonajaksi

datetime strptime() -toiminnolla voidaan luoda datetime-olio päivämäärä- tai aika-merkkijonosta. Alkuperäistä merkkijonoa vastaava muotoilujono on määritettävä.

ISO 8601 -merkkijonoja varten on myös oma menetelmä (Python 3.7 tai uudempi).

Esimerkkikoodi

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

Käyttämällä strftime()-metodia haettuun datetime-olioon voit esittää päivämäärän ja kellonajan eri muodossa kuin alkuperäisen merkkijonon.

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

Jos muunnat sen datetime-olioksi, voit suorittaa operaatioita myös timedelta-olioilla, joten voit esimerkiksi luoda merkkijonon päivämäärästä 10 päivää sitten samassa muodossa.

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