Conversió de dates i hores a i des de cadenes a Python datetime (strftime, strptime)

Negocis

La biblioteca estàndard de datetime de Python es pot utilitzar per processar dates i hores (dates, hores i hores). Els mètodes strftime() i strptime(), que converteixen dates i hores a i des de cadenes, es poden utilitzar per manipular dates i hores en diversos formats.

També pot realitzar operacions com la resta i la suma. Per exemple, podeu calcular i obtenir fàcilment la data fa 10 dies o d’aquí a 3 setmanes, o l’hora d’aquí a 50 minuts.

Primer, descriurem les següents classes d’objectes disponibles al mòdul datetime.

  • datetime.datetime:Data i hora (data i hora)
  • datetime.date:Data
  • datetime.time:Temps
  • datetime.timedelta:Diferència horària i temps transcorregut

També s’expliquen els mètodes strftime() i strptime(), que converteixen data/hora i cadena entre si.

  • datetimeobjecte
    • datetime.now():Data d’avui, hora actual
    • datetimeConstructor d’objectes
    • Conversió d’un objecte de data i hora en un objecte de data
  • dateobjecte
    • date.today():La cita d’avui
    • Constructor per a l’objecte data
  • timeobjecte
    • Constructor de l’objecte de temps
  • timedeltaobjecte
    • Resta objectes datatime i data per crear objectes timedelta.
    • Constructor de l’objecte timedelta
    • Resta i suma utilitzant objectes timedelta
  • strftime():Conversió de data i hora a cadena
  • strptime():Conversió de cadena a data i hora

També s’inclou a la biblioteca estàndard el mòdul calendari, que genera calendaris en format text pla o HTML.

objecte datetime

Un objecte datetime és un objecte que té informació de data (any, mes, dia) i hora (hora, minut, segon, microsegon). Podeu accedir a aquesta informació amb els atributs següents.

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

datetime.now():Data d’avui, hora actual

datetime.now() us donarà un objecte datetime amb la data d’avui (la data actual) i l’hora actual.

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 per a l’objecte datetime

També és possible generar objectes datetime per a dates i hores arbitràries.

El constructor de l’objecte datetime és el següent.

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

Els valors següents són obligatoris i es poden ometre altres. Si s’omet, el valor per defecte és 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

Conversió d’un objecte de data i hora en un objecte de data

Un objecte de data i hora es pot convertir en un objecte de data mitjançant el mètode date(), tal com es descriu a continuació.

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

objecte de data

Un objecte data és un objecte que conté informació sobre una data (any, mes, dia). S’hi pot accedir mitjançant els atributs any, mes i dia.

date.today():La cita d’avui

La data objecte de la data actual (la data d’avui) es pot obtenir amb 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 per a l’objecte data

El constructor de l’objecte data és el següent

date(year, month, day)

Tots són obligatoris i no es poden ometre.

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

print(d.month)
# 2

objecte temporal

L’objecte de temps és un objecte que conté informació sobre el temps (hores, minuts, segons i microsegons). S’hi pot accedir mitjançant els atributs hora, minut, segon i microsegon.

Constructor de l’objecte de temps

El constructor de l’objecte de temps és el següent.

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

Tots són opcionals i, si s’ometen, s’estableixen a 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

objecte timedelta

L’objecte timedelta és un objecte que representa la diferència de temps entre dues dates i hores, o el temps transcorregut. Té informació en dies, segons i microsegons, i es pot accedir mitjançant els atributs dies, segons i microsegons. També és possible obtenir el nombre total de segons mitjançant el mètode total_seconds().

Resta objectes de data i hora per crear un objecte timedelta.

En restar objectes de data i hora els uns dels altres, s’obté un objecte 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

La resta d’objectes de data els uns dels altres produeix de manera similar un objecte timedelta.

Constructor de l’objecte timedelta

El constructor de l’objecte timedelta és el següent

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

Tots són opcionals i, si s’ometen, s’estableixen a 0.

Tingueu en compte que l’objecte timedelta només conté la informació següent.

  • un nombre de dies:days
  • nombre de segons:seconds
  • recompte de microsegons:microseconds

Per exemple, els dos següents són iguals

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

print(td_1w.days)
# 7

Resta i suma utilitzant objectes timedelta

L’objecte timedelta es pot utilitzar amb els objectes datetime i data per realitzar operacions com ara la resta i la suma. Per exemple, podeu calcular i obtenir fàcilment la data fa una setmana o d’aquí 10 dies, o l’hora d’aquí a 50 minuts.

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

També es pot utilitzar per calcular el nombre de dies fins a una data concreta.

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

print(td.days)
# 903

strftime():Conversió de data i hora a cadena

El mètode strftime() dels objectes datetime i data es pot utilitzar per convertir la informació de data i hora (data i hora) en una cadena en qualsevol format.

codi de format

Consulteu la documentació oficial a continuació per obtenir els codis de format disponibles.

Els codis de format principals es mostren a continuació.

  • %d:Dia del mes en notació decimal amb zero emplenat.
  • %m:Mes en notació decimal amb zero emplenat.
  • %y:Les dues últimes xifres de l’any en notació decimal ple de zero.
  • %Y:Quatre dígits de l’any en notació decimal amb zero emplenat.
  • %H:Quan s’expressa en notació decimal amb zero emplenat (notació de 24 hores)
  • %I:Quan s’expressa en notació decimal amb zero emplenat (notació de 12 hores)
  • %M:Per a la notació decimal amb zero emplenat.
  • %S:Segons en notació decimal amb zero emplenat.
  • %f:Microsegons (6 dígits) en notació decimal amb 0 emplenat.
  • %A:Nom del dia de la setmana de la localització
  • %a:Nom del dia de la localització (forma abreujada)
  • %B:Nom local del mes
  • %b:Nom local del mes (forma abreujada)
  • %j:Dia de l’any en notació decimal amb ompliment zero.
  • %U:Número de setmana de l’any en notació decimal amb ompliment de zero (la setmana comença el diumenge)
  • %W:Número de setmana de l’any en notació decimal amb zero (la setmana comença el dilluns)

Els codis de format següents per als noms del dia i del mes es poden obtenir en diferents cadenes en funció de la configuració regional.

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

També hi ha un mètode dedicat per a les cadenes de format ISO 8601.

Codi de mostra

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

Si voleu obtenir un número en lloc d’una cadena, només heu de convertir-lo en un enter amb int().

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

En combinació amb l’objecte timedelta, és fàcil crear, per exemple, una llista de dates quinzenals en qualsevol 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

Utilitzar la notació de comprensió de llista és més intel·ligent.

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():Conversió de cadena a data i hora

datetime strptime() es pot utilitzar per crear un objecte datetime a partir d’una cadena de data o hora. Cal especificar la cadena de format corresponent a la cadena original.

També hi ha un mètode dedicat per a les cadenes ISO 8601 (Python 3.7 o posterior).

Codi de mostra

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

Si utilitzeu el mètode strftime() a l’objecte datetime recuperat, podeu representar la data i l’hora en un format diferent del de la cadena original.

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

Si el converteixes en un objecte datetime, també pots realitzar operacions amb objectes timedelta, de manera que, per exemple, pots generar una cadena d’una data de fa 10 dies en el mateix 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