Librăria standard datetime din Python poate fi utilizată pentru a procesa date și ore (date, ore și timpi). Metodele strftime() și strptime(), care convertesc datele și orele în și din șiruri de caractere, pot fi utilizate pentru a manipula datele și orele într-o varietate de formate.
De asemenea, poate efectua operații precum scăderea și adunarea. De exemplu, puteți calcula și obține cu ușurință data de acum 10 zile sau de peste 3 săptămâni, sau ora peste 50 de minute.
În primul rând, vom descrie următoarele clase de obiecte disponibile în modulul datetime.
datetime.datetime
:Data și ora (data și ora)datetime.date
:Datadatetime.time
:Timpdatetime.timedelta
:Diferența de timp și timpul scurs
De asemenea, sunt explicate metodele strftime() și strptime(), care convertesc între ele date\time și string.
datetime
obiectdatetime.now()
:Data de astăzi, ora curentădatetime
Constructor de obiecte- Conversia unui obiect datetime într-un obiect date
date
obiectdate.today()
:Data de astăzi- Constructor pentru obiectul date
time
obiect- Constructor pentru obiectul timp
timedelta
obiect- Se scad obiectele datetime și date pentru a crea obiecte timedelta.
- Constructor pentru obiectul timedelta
- Scăderea și adunarea folosind obiecte timedelta
strftime()
:Conversia de la data și ora în șir de caracterestrptime()
:Conversia din șir de caractere în dată și oră
În biblioteca standard este inclus și modulul calendar, care generează calendare în format text simplu sau HTML.
obiect datetime
Un obiect datetime este un obiect care conține atât informații despre dată (an, lună, zi), cât și despre timp (oră, minut, secundă, microsecundă). Puteți accesa aceste informații cu ajutorul următoarelor atribute.
year
month
day
hour
minute
second
microsecond
datetime.now(): Data de astăzi, ora curentă
datetime.now() vă va oferi un obiect datetime cu data de astăzi (data curentă) și ora curentă.
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
Constructor pentru obiectul datetime
De asemenea, este posibil să se genereze obiecte datetime pentru date și ore arbitrare.
Constructorul pentru obiectul datetime este următorul.
datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None)
Următoarele valori sunt obligatorii, iar celelalte pot fi omise. Dacă sunt omise, valoarea implicită este 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
Conversia unui obiect datetime într-un obiect date
Un obiect datetime poate fi convertit într-un obiect date prin metoda date(), după cum se descrie în continuare.
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'>
obiect data
Un obiect dată este un obiect care conține informații despre o dată (an, lună, zi). Acesta poate fi accesat prin atributele an, lună și zi.
date.today(): Data de astăzi
Obiectul date al datei curente (data de azi) poate fi obținut cu 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
Constructor pentru obiectul date
Constructorul pentru obiectul date este următorul
date(year, month, day)
Toate sunt obligatorii și nu pot fi omise.
d = datetime.date(2018, 2, 1)
print(d)
# 2018-02-01
print(d.month)
# 2
obiect de timp
Obiectul „time” este un obiect care conține informații despre timp (ore, minute, secunde și microsecunde). Acesta poate fi accesat folosind atributele oră, minut, secundă și microsecundă.
Constructor pentru obiectul timp
Constructorul obiectului timp este următorul.
time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None)
Toate acestea sunt opționale, iar dacă sunt omise, sunt setate la 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
obiect timedelta
Obiectul timedelta este un obiect care reprezintă diferența de timp între două date și ore sau timpul scurs. Acesta conține informații în zile, secunde și microsecunde și poate fi accesat prin atributele days, seconds și microseconds. De asemenea, este posibil să se obțină numărul total de secunde folosind metoda total_secunde().
Sustrage obiectele datetime și date pentru a crea obiectul timedelta.
Dacă se scad între ele obiecte datetime, se obține un obiect 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
În mod similar, prin scăderea reciprocă a obiectelor date se obține un obiect timedelta.
Constructor pentru obiectul timedelta
Constructorul obiectului timedelta este după cum urmează
timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
Toate acestea sunt opționale, iar dacă sunt omise, sunt setate la 0.
Rețineți că obiectul timedelta conține doar următoarele informații.
- un număr de zile:
days
- numărul de secunde:
seconds
- număr de microsecunde:
microseconds
De exemplu, următoarele două sunt egale
weeks=1
days=7
td_1w = datetime.timedelta(weeks=1)
print(td_1w)
# 7 days, 0:00:00
print(td_1w.days)
# 7
Scăderea și adunarea folosind obiecte timedelta
Obiectul timedelta poate fi utilizat împreună cu obiectele datetime și date pentru a efectua operații cum ar fi scăderea și adunarea. De exemplu, puteți calcula și obține cu ușurință data de acum o săptămână sau de peste 10 zile, sau ora peste 50 de minute.
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
De asemenea, poate fi utilizat pentru a calcula numărul de zile până la o anumită dată.
d_target = datetime.date(2020, 7, 24)
td = d_target - d_today
print(td)
# 903 days, 0:00:00
print(td.days)
# 903
strftime(): Conversia de la data și ora în șir de caractere
Metoda strftime() a obiectelor datetime și date poate fi utilizată pentru a converti informațiile privind data și ora (data și ora) într-un șir de caractere în orice format.
cod de formatare
Consultați documentația oficială de mai jos pentru codurile de formatare disponibile.
Principalele coduri de formatare sunt enumerate mai jos.
%d
:Ziua lunii în notație zecimală cu zero.%m
:Luna în notație zecimală cu zero.%y
:Ultimele două cifre ale anului în notație zecimală completată cu zero.%Y
:Patru cifre ale anului în notație zecimală cu zero.%H
:Atunci când se exprimă în notație zecimală cu zero (notație pe 24 de ore)%I
:Atunci când se exprimă în notație zecimală cu zero completat (notație pe 12 ore)%M
:Pentru notația zecimală cu zero umplut.%S
:Secunde în notație zecimală cu zero.%f
:Microsecunde (6 cifre) în notație zecimală cu 0 plin.%A
:Numele zilei săptămânii pentru localitate%a
:Numele zilei pentru localitate (formă prescurtată)%B
:Numele lunii locale%b
:Numele lunii locale (formă prescurtată)%j
:Ziua anului în notație zecimală cu zero.%U
:Numărul săptămânii din an în notație zecimală cu zero (săptămâna începe duminică)%W
:Numărul săptămânii din an în notație zecimală cu zero (săptămâna începe luni)
Următoarele coduri de formatare pentru numele zilelor și lunilor pot fi obținute în diferite șiruri de caractere, în funcție de localitate.
%A
%a
%B
%b
Există, de asemenea, o metodă dedicată pentru șirurile în format ISO 8601.
Exemplu de cod
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
Dacă doriți să obțineți un număr în loc de un șir de caractere, trebuie doar să îl convertiți într-un număr întreg cu int().
week_num_mon = int(d_today.strftime('%W'))
print(week_num_mon)
print(type(week_num_mon))
# 5
# <class 'int'>
În combinație cu obiectul timedelta, este ușor de creat, de exemplu, o listă de date bisăptămânale în orice format.
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
Utilizarea notației de înțelegere a listei este mai inteligentă.
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']
- Articole conexe:Utilizarea notației Python list comprehensions
strptime(): Conversia din șir de caractere în dată și oră
datetime strptime() poate fi utilizat pentru a crea un obiect datetime dintr-un șir de date sau de ore. Este necesar să se specifice șirul de formatare corespunzător șirului original.
Există, de asemenea, o metodă dedicată pentru șirurile ISO 8601 (Python 3.7 sau o versiune ulterioară).
Exemplu de cod
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'>
Prin utilizarea metodei strftime() asupra obiectului datetime recuperat, puteți reprezenta data și ora într-un format diferit de cel al șirului original.
print(date_dt.strftime('%Y-%m-%d %H:%M'))
# 2018-02-01 12:30
Dacă îl convertiți într-un obiect datetime, puteți efectua, de asemenea, operații cu obiecte timedelta, astfel încât, de exemplu, puteți genera un șir de date de acum 10 zile în același format.
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