Conversione di date e orari da e verso stringhe in Python datetime (strftime, strptime)

Attività commerciale

La libreria standard di Python datetime può essere usata per elaborare date e ore (date, orari e tempi). I metodi strftime() e strptime(), che convertono date e orari da e verso stringhe, possono essere usati per manipolare date e orari in una varietà di formati.

Può anche eseguire operazioni come la sottrazione e l'addizione. Per esempio, si può facilmente calcolare e ottenere la data di 10 giorni fa o di 3 settimane da ora, o l'ora a 50 minuti da ora.

Per prima cosa, descriveremo le seguenti classi di oggetti disponibili nel modulo datetime.

  • datetime.datetime:Data e ora (data e ora)
  • datetime.date:Data
  • datetime.time:Tempo
  • datetime.timedelta:Differenza di tempo e tempo trascorso

I metodi strftime() e strptime(), che convertono date\time e stringhe tra loro, sono anche spiegati.

  • datetimeoggetto
    • datetime.now():Data di oggi, ora corrente
    • datetimeCostruttore di oggetti
    • Convertire un oggetto datetime in un oggetto data
  • dateoggetto
    • date.today():Data di oggi
    • Costruttore per l'oggetto date
  • timeoggetto
    • Costruttore per l'oggetto time
  • timedeltaoggetto
    • Sottrae gli oggetti datetime e date per creare oggetti timedelta.
    • Costruttore dell'oggetto timedelta
    • Sottrazione e addizione usando oggetti timedelta
  • strftime():Conversione da data e ora a stringa
  • strptime():Conversione da stringa a data e ora

Nella libreria standard è incluso anche il modulo calendar, che genera calendari in formato testo semplice o HTML.

oggetto datetime

Un oggetto datetime è un oggetto che ha sia informazioni sulla data (anno, mese, giorno) che sul tempo (ora, minuto, secondo, microsecondo). È possibile accedere a queste informazioni con i seguenti attributi.

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

datetime.now(): Data di oggi, ora corrente

datetime.now() vi darà un oggetto datetime con la data di oggi (la data corrente) e l'ora corrente.

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

Costruttore per l'oggetto datetime

È anche possibile generare oggetti datetime per date e orari arbitrari.

Il costruttore dell'oggetto datetime è il seguente.

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

I seguenti valori sono richiesti e gli altri possono essere omessi. Se omessi, il valore predefinito è 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

Convertire un oggetto datetime in un oggetto data

Un oggetto datetime può essere convertito in un oggetto data dal metodo date(), come descritto in seguito.

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

oggetto data

Un oggetto data è un oggetto che contiene informazioni su una data (anno, mese, giorno). Vi si può accedere tramite gli attributi anno, mese e giorno.

date.today(): Data di oggi

L'oggetto data della data corrente (data odierna) può essere ottenuto con 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

Costruttore per l'oggetto date

Il costruttore dell'oggetto data è il seguente

date(year, month, day)

Tutti sono richiesti e non possono essere omessi.

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

print(d.month)
# 2

oggetto tempo

L'oggetto tempo è un oggetto che contiene informazioni sul tempo (ore, minuti, secondi e microsecondi). Vi si può accedere usando gli attributi ora, minuto, secondo e microsecondo.

Costruttore per l'oggetto time

Il costruttore dell'oggetto time è il seguente.

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

Tutti sono opzionali, e se vengono omessi, sono impostati 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

oggetto timedelta

L'oggetto timedelta è un oggetto che rappresenta la differenza di tempo tra due date e orari, o il tempo trascorso. Ha informazioni in giorni, secondi e microsecondi, e vi si può accedere con gli attributi days, seconds e microseconds. È anche possibile ottenere il numero totale di secondi usando il metodo total_seconds().

Sottrae gli oggetti datetime e date per creare l'oggetto timedelta.

Sottraendo gli oggetti datetime tra loro si ottiene un oggetto 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 sottrazione degli oggetti data l'uno dall'altro produce analogamente un oggetto timedelta.

Costruttore dell'oggetto timedelta

Il costruttore dell'oggetto timedelta è il seguente

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

Tutti sono opzionali, e se vengono omessi, sono impostati a 0.

Si noti che l'oggetto timedelta contiene solo le seguenti informazioni.

  • un certo numero di giorni: days
  • numero di secondi: seconds
  • conteggio dei microsecondi: microseconds

Per esempio, i due seguenti sono uguali

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

print(td_1w.days)
# 7

Sottrazione e addizione usando oggetti timedelta

L'oggetto timedelta può essere usato con gli oggetti datetime e date per eseguire operazioni come la sottrazione e l'addizione. Per esempio, si può facilmente calcolare e ottenere la data di una settimana fa o di 10 giorni da ora, o l'ora a 50 minuti da ora.

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

Può anche essere usato per calcolare il numero di giorni fino a una data specifica.

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

print(td.days)
# 903

strftime(): Conversione da data e ora a stringa

Il metodo strftime() degli oggetti datetime e date può essere usato per convertire le informazioni di data e ora in una stringa in qualsiasi formato.

codice di formattazione

Vedi la documentazione ufficiale qui sotto per i codici di formattazione disponibili.

I principali codici di formattazione sono elencati di seguito.

  • %d:Giorno del mese in notazione decimale con zero riempito.
  • %m:Mese in notazione decimale con zero riempito.
  • %y:Le ultime due cifre dell'anno in notazione decimale a zero.
  • %Y:Quattro cifre dell'anno in notazione decimale con lo zero riempito.
  • %H:Se espresso in notazione decimale con zero pieno (notazione a 24 ore)
  • %I:Se espresso in notazione decimale con zero pieno (notazione in 12 ore)
  • %M:Per la notazione decimale con zero riempito.
  • %S:Secondi in notazione decimale con zero riempito.
  • %f:Microsecondi (6 cifre) in notazione decimale con 0 pieno.
  • %A:Nome del giorno della settimana per il locale
  • %a:Nome del giorno per il locale (forma abbreviata)
  • %B:Nome del mese locale
  • %b:Nome del mese locale (forma abbreviata)
  • %j:Giorno dell'anno in notazione decimale con riempimento a zero.
  • %U:Numero della settimana dell'anno in notazione decimale con riempimento a zero (la settimana inizia di domenica)
  • %W:Numero della settimana dell'anno in notazione decimale con riempimento a zero (la settimana inizia il lunedì)

I seguenti codici di formattazione per i nomi dei giorni e dei mesi possono essere ottenuti in stringhe diverse a seconda del locale.

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

C'è anche un metodo dedicato per le stringhe in formato ISO 8601.

Codice campione

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

Se volete ottenere un numero invece di una stringa, basta convertirlo in un intero con int().

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

In combinazione con l'oggetto timedelta, è facile creare, per esempio, una lista di date bisettimanali in qualsiasi formato.

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

Usare la notazione di comprensione della lista è più intelligente.

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(): Conversione da stringa a data e ora

datetime strptime() può essere usato per creare un oggetto datetime da una stringa di data o ora. È necessario specificare la stringa di formattazione corrispondente alla stringa originale.

C'è anche un metodo dedicato per le stringhe ISO 8601 (Python 3.7 o successivo).

Codice campione

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

Usando il metodo strftime() sull'oggetto datetime recuperato, potete rappresentare la data e l'ora in un formato diverso dalla stringa originale.

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

Se lo convertite in un oggetto datetime, potete anche eseguire operazioni con oggetti timedelta, così, per esempio, potete generare una stringa di una data 10 giorni fa nello stesso formato.

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