Quando si usa Python, arriva sempre il momento di capire come “manipolare” i dati temporali e in particolare la data e l’ora.
In questo articolo descriviamo le principali funzioni relative a l modulo DateTime, già compreso nell’installazione base di Python. Se cerchi qualcosa di semplice ma pratico con esempi, continua a leggere!
In particolare vediamo tutti e 7 i seguenti argomenti più popolari:
- Data e ora di oggi in diversi formati
- Conversione da stringa a data
- La differenza nel calcolo di DateTime
- Datetime più/meno un’ora specifica
- Confronto data/ora
- Impostazioni fusi orari
- Unix timestamp / calcolo del tempo dell’epoca
Data e ora di oggi in diversi formati
Vediamo la manipolazione più semplice. Di seguito è riportato il codice che stampa l’anno, il mese, la data, l’ora, i minuti, i secondi e i millisecondi correnti.
In: from datetime import datetime
d = datetime.now() #today's datetime
d
Out:datetime.datetime(2019, 12, 22, 13, 14, 18, 193898)
In: print(d.weekday()) #day of week - Monday is 0 and Sunday is 6
print(d.year)
print(d.month)
print(d.day)
print(d.hour)
print(d.minute)
print(d.second)
Out: 6
2019
12
22
13
14
18
Inoltre, potrebbero essere necessari formati specifici della data/ora. Possiamo utilizzare il seguente elenco per personalizzare diversi formati di data. Questo può essere considerato un modo per convertire la data in stringa.
L’elenco completo dei formati può essere consultato in questa pagina.
In: print(d.strftime("%A %d/%m/%Y")) # date to string
Out: Sunday 22/12/2019
Conversione da stringa a data
Di seguito sono riportati esempi che mostrano due stringhe convertite in formato data:
In: date_string = '2016-02-01 12:00PM'
print(datetime.strptime(date_string, '%Y-%m-%d %I:%M%p'))
Out: 2016-02-01 12:00:00
In: date_string = '02/01/2016'
d2 = datetime.strptime(date_string, '%m/%d/%Y')
print(d2)
Out: 2016-02-01 00:00:00
La differenza nel calcolo di DateTime
L’esempio seguente stampa la differenza in giorni (ad esempio, tra oggi e 1 febbraio 2016):
In: from datetime import timedelta
d = datetime.now()
date_string = '2/01/2016'
d2 = datetime.strptime(date_string, '%m/%d/%Y')
print(d - d2)
Out: 1420 days, 13:18:27.386763
In: date_diff = (d - d2)/timedelta(days=1)
print('date_diff = {} days'.format(date_diff))
Out: date_diff = 1420.5544836430902 days
In: date_diff = (d - d2)/timedelta(weeks=1)
print('date_diff = {} weeks'.format(date_diff))
Out: date_diff = 202.93635480615575 weeks
In: date_diff = (d - d2)/timedelta(days=365)
print('date_diff = {} years'.format(date_diff))
Out: date_diff = 3.8919300921728497 years
Datetime più/meno un’ora specifica
Facciamo un “viaggio nel tempo” con diversi intervalli di tempo di secondi, minuti, ore, giorni, settimane o anni:
In: print(d + timedelta(seconds=1)) # today + one second
print(d + timedelta(minutes=1)) # today + one minute
print(d + timedelta(hours=1)) # today + one hour
print(d + timedelta(days=1)) # today + one day
print(d + timedelta(weeks=1)) # today + one week
print(d + timedelta(days=1)*365) # today + one year
Out: 2019-12-22 13:18:28.386763
2019-12-22 13:19:27.386763
2019-12-22 14:18:27.386763
2019-12-23 13:18:27.386763
2019-12-29 13:18:27.386763
2020-12-21 13:18:27.386763
Confronto data/ora
I confronti tra le date sono semplici e sono effettuati con i soliti simboli di confronto:
In: print(d < (d2 +(timedelta(days=365*6)))) # d is no more than 6 years (assume each year has 365 days) after d2?
print(d > (d2 +(timedelta(weeks=52*6)))) # d is more than 6 years (assume each year has 52 weeks) after d2?
print(d != d2) # d2 is not the same date as d?
print(d == d2) # d2 is the same date as d?
Out: True
False
True
False
Impostazioni fusi orari
Possiamo anche confrontare l’ora in diversi fusi orari, come Toronto e Shanghai:
In: import pytz
timezone = pytz.timezone("America/Toronto")
dtz = timezone.localize(d)
print(dtz.tzinfo)
print(dtz)
Out: America/Toronto
2019-12-22 13:18:27.386763-05:00
In: shanghai_dt = dtz.astimezone(pytz.timezone("Asia/Shanghai"))
print(shanghai_dt)
Out: 2019-12-23 02:18:27.386763+08:00
In: (dtz - shanghai_dt)/timedelta(days=1) # same datetimes
Out: 0.0
In: (dtz - shanghai_dt)/timedelta(days=1) # same datetimes
Out: 0.0
In: for tz in pytz.all_timezones:
print(tz)
Out: Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa
(Stampate solo le prime 3 come esempio)
Unix timestamp / calcolo del tempo dell’epoca
I timestamp sono comunemente usati per i file nei sistemi operativi Unix. Spesso vengono visualizzati anche nei set di dati.
Innanzitutto, possiamo ottenere il timestamp Unix corrente:
In: from datetime import timezone
dt_now = datetime.now(timezone.utc)
print(dt_now)
print(dt_now.tzinfo)
print(dt_now.timestamp()) # the unix timestamp.
Out: 2019-12-22 18:21:28.681380+00:00
UTC
1577038888.68138
Inoltre, possiamo convertire il timestamp Unix nel formato DateTime:
In: utc_timestamp = 1377050861.206272
unix_ts_dt = datetime.fromtimestamp(utc_timestamp, timezone.utc)
print(unix_ts_dt)
print(unix_ts_dt.astimezone(pytz.timezone("America/Toronto")))
print(unix_ts_dt.astimezone(pytz.timezone("Asia/Shanghai")))
Out: 2013-08-21 02:07:41.206272+00:00
2013-08-20 22:07:41.206272-04:00
2013-08-21 10:07:41.206272+08:00