Konvertering af datoer og tidspunkter til og fra strenge i Python datetime (strftime, strptime)

Forretning

Pythons standardbibliotek datetime kan bruges til at behandle datoer og tidspunkter (datoer, tidspunkter og tidspunkter). Metoderne strftime() og strptime(), som konverterer datoer og tidspunkter til og fra strenge, kan bruges til at manipulere datoer og tidspunkter i en række forskellige formater.

Den kan også udføre operationer som subtraktion og addition. Du kan f.eks. nemt beregne og få datoen for 10 dage siden eller om 3 uger eller klokken om 50 minutter fra nu.

Først vil vi beskrive følgende klasser af objekter, der er tilgængelige i datetime-modulet.

  • datetime.datetime:Dato og klokkeslæt (dato og klokkeslæt)
  • datetime.date:Dato
  • datetime.time:Tid
  • datetime.timedelta:Tidsforskel og forløbne tid

Metoderne strftime() og strptime(), som konverterer date\time og string til hinanden, er også forklaret.

  • datetimeobjekt
    • datetime.now():Dagens dato, nuværende klokkeslæt
    • datetimeObjektkonstruktør
    • Konvertering af et datetime-objekt til et date-objekt
  • dateobjekt
    • date.today():Dagens dato
    • Konstruktør for datoobjektet
  • timeobjekt
    • Konstruktør for tidsobjektet
  • timedeltaobjekt
    • Subtraherer datetime- og datoobjekter for at oprette timedelta-objekter.
    • Konstruktør for timedelta-objektet
    • Subtraktion og addition ved hjælp af timedelta-objekter
  • strftime():Konvertering fra dato og klokkeslæt til streng
  • strptime():Konvertering fra streng til dato og tid

Kalendermodulet, som genererer kalendere i almindelig tekst eller HTML-format, er også inkluderet i standardbiblioteket.

datetime-objekt

Et datetime-objekt er et objekt, der indeholder både dato- (år, måned, dag) og tidsoplysninger (time, minut, sekund, mikrosekund). Du kan få adgang til disse oplysninger med følgende attributter.

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

datetime.now(): Dagens dato, nuværende klokkeslæt

datetime.now() giver dig et datetime-objekt med dagens dato (den aktuelle dato) og det aktuelle klokkeslæt.

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

Konstruktør for datetime-objekt

Det er også muligt at generere datotidsobjekter for vilkårlige datoer og tidspunkter.

Konstruktøren for datetime-objektet er som følger.

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

Følgende værdier er obligatoriske, og andre kan udelades. Hvis de udelades, er standardværdien 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

Konvertering af et datetime-objekt til et date-objekt

Et datetime-objekt kan konverteres til et date-objekt ved hjælp af date()-metoden, som beskrevet nedenfor.

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

datoobjekt

Et dato-objekt er et objekt, der indeholder oplysninger om en dato (år, måned, dag). Det kan tilgås ved hjælp af attributterne år, måned og dag.

date.today(): Dagens dato

Dato-objektet for den aktuelle dato (dagens dato) kan fås med 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

Konstruktør for datoobjektet

Konstruktøren for dato-objektet er som følger

date(year, month, day)

Alle er obligatoriske og kan ikke udelades.

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

print(d.month)
# 2

tidsobjekt

Time-objektet er et objekt, der indeholder oplysninger om tid (timer, minutter, sekunder og mikrosekunder). Det kan tilgås ved hjælp af attributterne time, minut, sekund og mikrosekund.

Konstruktør for tidsobjektet

Konstruktøren af time-objektet er som følger.

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

De er alle valgfrie, og hvis de udelades, sættes de til 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

timedelta-objekt

Timedelta-objektet er et objekt, der repræsenterer tidsforskellen mellem to datoer og tidspunkter, eller den forløbstid, der er gået. Det har oplysninger i dage, sekunder og mikrosekunder og kan tilgås ved hjælp af attributterne dage, sekunder og mikrosekunder. Det er også muligt at få det samlede antal sekunder ved hjælp af metoden total_seconds().

Subtraherer datetime- og date-objekter for at skabe timedelta-objekt.

Subtraktion af datetime-objekter fra hinanden giver et timedelta-objekt.

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

Subtraktion af dato-objekter fra hinanden giver på samme måde et timedelta-objekt.

Konstruktør for timedelta-objektet

Konstruktøren af timedelta-objektet er som følger

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

De er alle valgfrie, og hvis de udelades, sættes de til 0.

Bemærk, at timedelta-objektet kun indeholder følgende oplysninger.

  • et antal dage: days
  • antal sekunder: seconds
  • antal mikrosekunder: microseconds

For eksempel er følgende to lige store

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

print(td_1w.days)
# 7

Subtraktion og addition ved hjælp af timedelta-objekter

Timedelta-objektet kan bruges sammen med datetime- og date-objekterne til at udføre operationer som subtraktion og addition. Du kan f.eks. nemt beregne og hente datoen for en uge siden eller om 10 dage eller klokken 50 minutter fra nu.

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

Den kan også bruges til at beregne antallet af dage indtil en bestemt dato.

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

print(td.days)
# 903

strftime(): Konvertering fra dato og klokkeslæt til streng

Metoden strftime() for datetime- og dateobjekter kan bruges til at konvertere dato- og tidsoplysninger (dato og klokkeslæt) til en streng i et hvilket som helst format.

kode for formatering

Se den officielle dokumentation nedenfor for tilgængelige formateringskoder.

De vigtigste formateringskoder er anført nedenfor.

  • %d:Dag i måneden i decimal notation med nul udfyldt.
  • %m:Måned i decimal notation med nul udfyldt.
  • %y:De sidste to cifre i året i decimaltalsangivelse med nul.
  • %Y:Fire cifre i årstallet i decimal notation med nul udfyldt.
  • %H:I decimal notation med nul udfyldt (24-timers notation)
  • %I:I decimalnotation med nul udfyldt (12-timers notation)
  • %M:For decimal notation med nul udfyldt.
  • %S:Sekunder i decimal notation med nul udfyldt.
  • %f:Mikrosekunder (6 cifre) i decimal notation med 0 udfyldt.
  • %A:Navnet på ugedagen for lokalområdet
  • %a:Dagens navn for lokalområdet (forkortet form)
  • %B:Navn på den lokale måned
  • %b:Navnet på den lokale måned (forkortet form)
  • %j:Årets dag i decimal notation med nuludfyldning.
  • %U:Årets ugenummer i decimalnotation med nul som fyld (ugen begynder søndag)
  • %W:Årets ugenummer i decimalnotation med nul som fyld (ugen begynder mandag)

De følgende formateringskoder for dag- og månedsnavne kan fås i forskellige strenge afhængigt af lokalområdet.

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

Der findes også en særlig metode til ISO 8601-formatstrenge.

Kodeeksempel

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

Hvis du ønsker at få et tal i stedet for en streng, skal du blot konvertere det til et heltal med int().

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

I kombination med timedelta-objektet er det let at oprette f.eks. en liste over datoer hver anden uge i et hvilket som helst 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

Det er smartere at bruge list comprehension notation.

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(): Konvertering fra streng til dato og tid

datetime strptime() kan bruges til at oprette et datetime-objekt ud fra en dato- eller tidsstreng. Det er nødvendigt at angive den formateringsstreng, der svarer til den oprindelige streng.

Der findes også en særlig metode til ISO 8601-strenge (Python 3.7 eller nyere).

Kodeeksempel

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

Ved at bruge strftime()-metoden på det hentede datetime-objekt kan du repræsentere dato og klokkeslæt i et andet format end den oprindelige streng.

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

Hvis du konverterer den til et datetime-objekt, kan du også udføre operationer med timedelta-objekter, så du f.eks. kan generere en streng af en dato for 10 dage siden i samme 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