Come manipolare date e ore in Python

scienzadeidati articoli - Python Datetime

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.

Queste sono informazioni utili, ma spesso ne abbiamo bisogno solo in parte. Possiamo stampare le diverse parti di seguito.
            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.

articolo python datetime - format date
            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
        
Possiamo anche stampare solo la differenza tra due date-ora in giorni, settimane o anni, ecc.
            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
        
Per visualizzare l’intero elenco dei diversi fusi orari si può utilizzare il codice sottostante:
            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