Pretvarjanje datumov in časov v in iz nizov v programu Python datetime (strftime, strptime)

Posel

Pythonova standardna knjižnica datetime se lahko uporablja za obdelavo datumov in časov (datumov, časov in časov). Metodi strftime() in strptime(), ki pretvarjata datume in čase v in iz nizov, se lahko uporabljata za obdelavo datumov in časov v različnih oblikah.

Izvaja lahko tudi operacije, kot sta odštevanje in seštevanje. Zlahka lahko na primer izračunate in dobite datum pred 10 dnevi ali čez 3 tedne ali čas čez 50 minut.

Najprej bomo opisali naslednje razrede objektov, ki so na voljo v modulu datetime.

  • datetime.datetime:Datum in čas (datum in čas)
  • datetime.date:Datum
  • datetime.time:Čas
  • datetime.timedelta:Časovna razlika in pretečeni čas

Razloženi sta tudi metodi strftime() in strptime(), ki pretvarjata date\time in string drug v drugega.

  • datetimepredmet
    • datetime.now():Današnji datum, trenutni čas
    • datetimeKonstruktor objekta
    • Pretvarjanje objekta datetime v objekt date
  • datepredmet
    • date.today():Današnji datum
    • Konstruktor za objekt date
  • timepredmet
    • Konstruktor za objekt čas
  • timedeltapredmet
    • Z odštevanjem objektov datetime in date ustvarite objekte timedelta.
    • Konstruktor za objekt timedelta
    • Odštevanje in seštevanje z uporabo predmetov timedelta
  • strftime():Pretvorba datuma in časa v niz
  • strptime():Pretvorba iz niza v datum in čas

V standardno knjižnico je vključen tudi koledarski modul, ki ustvarja koledarje v obliki navadnega besedila ali HTML.

objekt datetime

Objekt datetime je objekt, ki vsebuje podatke o datumu (leto, mesec, dan) in času (ura, minuta, sekunda, mikrosekunda). Do teh informacij lahko dostopate z naslednjimi atributi.

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

datetime.now(): Današnji datum, trenutni čas

datetime.now() vam bo dal objekt datetime z današnjim datumom (trenutni datum) in trenutnim časom.

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 za objekt datetime

Prav tako je mogoče ustvariti objekte datetime za poljubne datume in čase.

Konstruktor za objekt datetime je naslednji.

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

Naslednje vrednosti so obvezne, druge lahko izpustite. Če so izpuščene, je privzeta vrednost 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

Pretvarjanje objekta datetime v objekt date

Objekt datetime lahko pretvorite v objekt date z metodo date(), kot je opisano v nadaljevanju.

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

predmet datum

Objekt datum je objekt, ki vsebuje informacije o datumu (leto, mesec, dan). Do njega lahko dostopamo z atributi leto, mesec in dan.

date.today(): Današnji datum

Datumski objekt trenutnega datuma (današnji datum) lahko dobite s funkcijo 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 za objekt date

Konstruktor za objekt date je naslednji

date(year, month, day)

Vsi so obvezni in jih ni mogoče izpustiti.

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

print(d.month)
# 2

časovni objekt

Objekt čas je objekt, ki vsebuje informacije o času (ure, minute, sekunde in mikrosekunde). Do njega lahko dostopamo z atributi ura, minuta, sekunda in mikrosekunda.

Konstruktor za objekt čas

Konstruktor objekta time je naslednji.

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

Vsi so neobvezni, in če so izpuščeni, se nastavijo 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

predmet timedelta

Objekt timedelta je objekt, ki predstavlja časovno razliko med dvema datumoma in časoma ali pretekli čas. Vsebuje podatke v dnevih, sekundah in mikrosekundah, do njih pa lahko dostopamo z atributi days, seconds in microseconds. Z metodo total_seconds() je mogoče dobiti tudi skupno število sekund.

Z odštevanjem objektov datetime in date ustvarite objekt timedelta.

Če med seboj odštejemo objekte datumov, dobimo objekt 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

Če odštejemo objekte datumov drug od drugega, dobimo objekt timedelta.

Konstruktor za objekt timedelta

Konstruktor objekta timedelta je naslednji

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

Vsi so neobvezni, in če so izpuščeni, se nastavijo na 0.

Upoštevajte, da objekt timedelta vsebuje samo naslednje informacije.

  • število dni: days
  • število sekund: seconds
  • štetje mikrosekund: microseconds

Naslednja dva sta na primer enaka

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

print(td_1w.days)
# 7

Odštevanje in seštevanje z uporabo predmetov timedelta

Objekt timedelta se lahko uporablja z objektoma datetime in date za izvajanje operacij, kot sta odštevanje in seštevanje. Tako lahko na primer preprosto izračunate in dobite datum pred enim tednom ali čez 10 dni ali čas čez 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

Uporabite ga lahko tudi za izračun števila dni do določenega datuma.

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

print(td.days)
# 903

strftime(): Pretvorba datuma in časa v niz

Metoda strftime() objektov datetime in date se lahko uporablja za pretvorbo podatkov o datumu in času (datumu in uri) v niz v katerem koli formatu.

koda za oblikovanje

Za razpoložljive kode oblikovanja glejte uradno dokumentacijo spodaj.

Glavne kode za oblikovanje so navedene spodaj.

  • %d:Dan v mesecu v decimalnem zapisu z izpolnjeno ničlo.
  • %m:Mesec v decimalnem zapisu z izpolnjeno ničlo.
  • %y:Zadnji dve številki leta v decimalnem zapisu z ničlo.
  • %Y:Štiri števke leta v decimalnem zapisu z zapolnjeno ničlo.
  • %H:Če je izražen v decimalnem zapisu z izpolnjeno ničlo (24-urni zapis)
  • %I:Če je izražen v decimalnem zapisu z izpolnjeno ničlo (12-urni zapis)
  • %M:Za decimalni zapis z zapolnjeno ničlo.
  • %S:Sekunde v decimalnem zapisu z zapolnjeno ničlo.
  • %f:Mikrosekunde (6 števk) v decimalnem zapisu z zapolnjeno 0.
  • %A:Ime dneva v tednu za krajevno območje
  • %a:Ime dneva v kraju (skrajšana oblika)
  • %B:Ime krajevnega meseca
  • %b:Ime krajevnega meseca (skrajšana oblika)
  • %j:Dan v letu v decimalnem zapisu z ničelnim polnilom.
  • %U:Številka tedna v letu v decimalnem zapisu z ničelnim polnilom (teden se začne v nedeljo)
  • %W:Številka tedna v letu v decimalnem zapisu z ničlo (teden se začne v ponedeljek)

Naslednje kode za oblikovanje imen dni in mesecev lahko dobite v različnih nizih, odvisno od lokalnega okolja.

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

Na voljo je tudi posebna metoda za nize v formatu ISO 8601.

Vzorčna koda

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

Če želite namesto niza dobiti število, ga pretvorite v celo število s funkcijo int().

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

V kombinaciji z objektom timedelta lahko preprosto ustvarite na primer seznam dvotedenskih datumov v poljubni obliki.

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

Uporaba zapisa za razumevanje seznama je pametnejša.

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(): Pretvorba iz niza v datum in čas

datetime strptime() lahko uporabite za ustvarjanje objekta datetime iz datumskega ali časovnega niza. Določiti je treba oblikovni niz, ki ustreza izvirnemu nizu.

Na voljo je tudi posebna metoda za nize ISO 8601 (Python 3.7 ali novejši).

Vzorčna koda

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

Z uporabo metode strftime() na pridobljenem objektu datetime lahko predstavite datum in čas v drugačni obliki kot prvotni niz.

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

Če ga pretvorite v objekt datetime, lahko izvajate tudi operacije z objekti timedelta, tako da lahko na primer ustvarite niz datuma izpred 10 dni v enaki obliki.

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