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
:Datadatetime.time
:Tempsdatetime.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.
datetime
objectedatetime.now()
:Data d’avui, hora actualdatetime
Constructor d’objectes- Conversió d’un objecte de data i hora en un objecte de data
date
objectedate.today()
:La cita d’avui- Constructor per a l’objecte data
time
objecte- Constructor de l’objecte de temps
timedelta
objecte- 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 cadenastrptime()
: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']
- Articles relacionats:Utilitzant la notació de comprensió de llista de Python
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