Conversia datelor și orelor în și din șiruri de caractere în Python datetime (strftime, strptime)

Afaceri

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:Data
  • datetime.time:Timp
  • datetime.timedelta:Diferența de timp și timpul scurs

De asemenea, sunt explicate metodele strftime() și strptime(), care convertesc între ele date\time și string.

  • datetimeobiect
    • datetime.now():Data de astăzi, ora curentă
    • datetimeConstructor de obiecte
    • Conversia unui obiect datetime într-un obiect date
  • dateobiect
    • date.today():Data de astăzi
    • Constructor pentru obiectul date
  • timeobiect
    • Constructor pentru obiectul timp
  • timedeltaobiect
    • 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 caractere
  • strptime():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']

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
Copied title and URL