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
:Aikadatetime.timedelta
:Aikaero ja kulunut aika
Lisäksi selitetään metodit strftime() ja strptime(), jotka muuttavat date\time- ja string-merkkijonot toisiinsa.
datetime
kohdedatetime.now()
:Tämän päivän päivämäärä, nykyinen kellonaikadatetime
Objektin rakentaja- Datetime-olion muuntaminen date-olioksi
date
kohdedate.today()
:Tämän päivän päivämäärä- Päivämääräobjektin konstruktori
time
kohde- Aikaobjektin konstruktori
timedelta
kohde- 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 merkkijonoksistrptime()
: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']
- Aiheeseen liittyvät artikkelit:Python-luettelon ymmärtämisen merkintätapojen käyttäminen
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