Suche…


Bemerkungen

Python bietet sowohl integrierte Methoden als auch externe Bibliotheken zum Erstellen, Ändern, Analysieren und Bearbeiten von Datum und Uhrzeit .

Parsen einer Zeichenfolge in ein Zeitzonenobjekt mit Zeitzone

Python 3.2+ unterstützt das %z Format, wenn eine Zeichenfolge in ein datetime Objekt datetime wird.

UTC-Offset in der Form +HHMM oder -HHMM (leere Zeichenfolge, wenn das Objekt nicht aktiv ist).

Python 3.x 3.2
import datetime
dt = datetime.datetime.strptime("2016-04-15T08:27:18-0500", "%Y-%m-%dT%H:%M:%S%z")

Für andere Python-Versionen können Sie eine externe Bibliothek wie dateutil , wodurch das Analysieren einer Zeichenfolge mit Zeitzone in ein datetime Objekt schnell ist.

import dateutil.parser
dt = dateutil.parser.parse("2016-04-15T08:27:18-0500")

Die Variable dt ist jetzt ein datetime Objekt mit dem folgenden Wert:

datetime.datetime(2016, 4, 15, 8, 27, 18, tzinfo=tzoffset(None, -18000))

Einfache Datumsberechnung

Termine existieren nicht isoliert. Es ist üblich, dass Sie die Zeit zwischen den Datumsangaben oder das Datum für morgen bestimmen müssen. Dies kann mit timedelta Objekten erreicht werden

import datetime

today = datetime.date.today()
print('Today:', today)

yesterday = today - datetime.timedelta(days=1)
print('Yesterday:', yesterday)

tomorrow = today + datetime.timedelta(days=1)
print('Tomorrow:', tomorrow)

print('Time between tomorrow and yesterday:', tomorrow - yesterday)

Dies führt zu ähnlichen Ergebnissen:

Today: 2016-04-15
Yesterday: 2016-04-14
Tomorrow: 2016-04-16
Difference between tomorrow and yesterday: 2 days, 0:00:00

Grundlegende Verwendung von datetime-Objekten

Das datetime-Modul enthält drei Haupttypen von Objekten - date, time und datetime.

import datetime

# Date object
today = datetime.date.today()
new_year = datetime.date(2017, 01, 01) #datetime.date(2017, 1, 1)

# Time object
noon = datetime.time(12, 0, 0) #datetime.time(12, 0)

# Current datetime
now = datetime.datetime.now()

# Datetime object
millenium_turn = datetime.datetime(2000, 1, 1, 0, 0, 0) #datetime.datetime(2000, 1, 1, 0, 0)

Arithmetische Operationen für diese Objekte werden nur innerhalb desselben Datentyps unterstützt. Wenn Sie eine einfache Arithmetik mit Instanzen verschiedener Typen ausführen, wird ein TypeError-Wert erzeugt.

# subtraction of noon from today
noon-today
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for -: 'datetime.time' and 'datetime.date'
However, it is straightforward to convert between types.

# Do this instead
print('Time since the millenium at midnight: ',
      datetime.datetime(today.year, today.month, today.day) - millenium_turn)

# Or this
print('Time since the millenium at noon: ',
      datetime.datetime.combine(today, noon) - millenium_turn)

Iteriere über Termine

Manchmal möchten Sie einen Datumsbereich von einem Startdatum bis zu einem Enddatum durchlaufen. Sie können dies mit einer datetime Bibliothek und einem timedelta tun:

import datetime

# The size of each step in days
day_delta = datetime.timedelta(days=1)

start_date = datetime.date.today()
end_date = start_date + 7*day_delta

for i in range((end_date - start_date).days):
    print(start_date + i*day_delta)

Was produziert:

2016-07-21
2016-07-22
2016-07-23
2016-07-24
2016-07-25
2016-07-26
2016-07-27

Analysieren einer Zeichenfolge mit einem kurzen Zeitzonennamen in ein Zeitzonenobjekt mit Datum und Uhrzeit

Wenn Sie die dateutil Bibliothek wie im vorherigen Beispiel zum Analysieren von Zeitzonen mit Zeitzonen verwenden , ist es auch möglich, Zeitmarken mit einem angegebenen "kurzen" Zeitzonennamen zu parsen.

Für Datumsangaben, die mit kurzen Zeitzonennamen oder Abkürzungen formatiert sind, die im Allgemeinen mehrdeutig sind (z. B. CST, z. B. Central Standard Time, China Standard Time, Cuba Standard Time usw.) - weitere Informationen finden Sie hier , ist es erforderlich, eine Zuordnung zwischen der Abkürzung für die Zeitzone und dem tzinfo Objekt tzinfo .

from dateutil import tz
from dateutil.parser import parse

ET = tz.gettz('US/Eastern')
CT = tz.gettz('US/Central')
MT = tz.gettz('US/Mountain')
PT = tz.gettz('US/Pacific')

us_tzinfos = {'CST': CT, 'CDT': CT,
              'EST': ET, 'EDT': ET,
              'MST': MT, 'MDT': MT,
              'PST': PT, 'PDT': PT}

dt_est = parse('2014-01-02 04:00:00 EST', tzinfos=us_tzinfos)
dt_pst = parse('2016-03-11 16:00:00 PST', tzinfos=us_tzinfos)

Nach dem Ausführen dieses:

dt_est
# datetime.datetime(2014, 1, 2, 4, 0, tzinfo=tzfile('/usr/share/zoneinfo/US/Eastern'))
dt_pst
# datetime.datetime(2016, 3, 11, 16, 0, tzinfo=tzfile('/usr/share/zoneinfo/US/Pacific'))

Es ist erwähnenswert, dass bei Verwendung einer pytz Zeitzone mit dieser Methode diese nicht richtig lokalisiert wird:

from dateutil.parser import parse
import pytz

EST = pytz.timezone('America/New_York')
dt = parse('2014-02-03 09:17:00 EST', tzinfos={'EST': EST})

Dadurch wird einfach die pytz Zeitzone an die datetime angehängt:

dt.tzinfo # Will be in Local Mean Time!
# <DstTzInfo 'America/New_York' LMT-1 day, 19:04:00 STD>

Wenn Sie diese Methode verwenden, sollten Sie nach dem Parsen wahrscheinlich den naiven Teil der datetime neu localize :

dt_fixed = dt.tzinfo.localize(dt.replace(tzinfo=None))
dt_fixed.tzinfo # Now it's EST.
# <DstTzInfo 'America/New_York' EST-1 day, 19:00:00 STD>)

Zeitzonenbasierte Datenzeiten erstellen

Standardmäßig sind alle datetime Objekte nicht aktiv. Um sie tzinfo zu machen, müssen Sie ein tzinfo Objekt anhängen, das den UTC-Offset und die Zeitzonenabkürzung als Funktion von Datum und Uhrzeit bereitstellt.

Versetzte Zeitzonen korrigiert

Für Zeitzonen, die einen festen Versatz von UTC haben, stellt das Modul datetime in Python 3.2 und datetime die timezone bereit, eine konkrete Implementierung von tzinfo , die ein Zeit- timedelta und einen (optionalen) Namensparameter benötigt:

Python 3.x 3.2
from datetime import datetime, timedelta, timezone
JST = timezone(timedelta(hours=+9))

dt = datetime(2015, 1, 1, 12, 0, 0, tzinfo=JST)
print(dt)
# 2015-01-01 12:00:00+09:00

print(dt.tzname())
# UTC+09:00

dt = datetime(2015, 1, 1, 12, 0, 0, tzinfo=timezone(timedelta(hours=9), 'JST'))
print(dt.tzname)
# 'JST'

Für Python-Versionen vor 3.2 ist es erforderlich, eine Drittanbieter-Bibliothek wie dateutil . dateutil stellt eine äquivalente Klasse, tzoffset , zur tzoffset , die (ab Version 2.5.3) Argumente der Form dateutil.tz.tzoffset(tzname, offset) , wobei der offset in Sekunden angegeben wird:

Python 3.x 3.2
Python 2.x 2.7
from datetime import datetime, timedelta
from dateutil import tz

JST = tz.tzoffset('JST', 9 * 3600) # 3600 seconds per hour
dt = datetime(2015, 1, 1, 12, 0, tzinfo=JST)
print(dt)
# 2015-01-01 12:00:00+09:00
print(dt.tzname)
# 'JST'

Zonen mit Sommerzeit

Für Zonen mit Sommerzeit stellen Python-Standardbibliotheken keine Standardklasse bereit. Daher ist die Verwendung einer Drittanbieter-Bibliothek erforderlich. pytz und dateutil sind beliebte Bibliotheken, die Zeitzonenklassen anbieten.

Neben statischen Zeitzonen bietet dateutil Zeitzonen-Klassen, die Sommerzeit verwenden (siehe Dokumentation zum tz Modul ). Mit der Methode tz.gettz() Sie ein Zeitzonenobjekt datetime , das direkt an den datetime Konstruktor übergeben werden kann:

from datetime import datetime
from dateutil import tz
local = tz.gettz() # Local time
PT = tz.gettz('US/Pacific') # Pacific time

dt_l = datetime(2015, 1, 1, 12, tzinfo=local) # I am in EST
dt_pst = datetime(2015, 1, 1, 12, tzinfo=PT)
dt_pdt = datetime(2015, 7, 1, 12, tzinfo=PT) # DST is handled automatically
print(dt_l)
# 2015-01-01 12:00:00-05:00
print(dt_pst)
# 2015-01-01 12:00:00-08:00
print(dt_pdt)
# 2015-07-01 12:00:00-07:00

VORSICHT : Seit Version 2.5.3 verarbeitet dateutil mehrdeutige Datumsangaben nicht korrekt und verwendet immer das spätere Datum. Es ist nicht möglich, ein Objekt mit einer dateutil Zeitzone zu dateutil , die beispielsweise 2015-11-01 1:30 EDT-4 , da dies während einer Sommerzeitumstellung erfolgt.

Bei Verwendung von pytz alle Kantenfälle ordnungsgemäß pytz . pytz Zeitzonen sollten jedoch nicht direkt durch den Konstruktor an Zeitzonen angehängt werden. Stattdessen sollte eine pytz Zeitzone mit der localize Methode der Zeitzone angefügt werden:

from datetime import datetime, timedelta
import pytz

PT = pytz.timezone('US/Pacific')
dt_pst = PT.localize(datetime(2015, 1, 1, 12))
dt_pdt = PT.localize(datetime(2015, 11, 1, 0, 30))
print(dt_pst)
# 2015-01-01 12:00:00-08:00
print(dt_pdt)
# 2015-11-01 00:30:00-07:00

Beachten Sie, dass Sie, wenn Sie eine Datums-Zeit-Arithmetik in einer pytz aware-Zeitzone durchführen, entweder die Berechnungen in UTC durchführen müssen (wenn Sie absolut abgelaufene Zeit wünschen) oder das Ergebnis mit normalize() aufrufen:

dt_new = dt_pdt + timedelta(hours=3) # This should be 2:30 AM PST
print(dt_new)
# 2015-11-01 03:30:00-07:00
dt_corrected = PT.normalize(dt_new)
print(dt_corrected)
# 2015-11-01 02:30:00-08:00

Fuzzy-Datetime-Analyse (Extrahieren von Datetime aus einem Text)

Es ist möglich, ein Datum aus einem Text mit dem dateutil Parser in einem "Fuzzy" -Modus zu extrahieren, wobei Komponenten der Zeichenfolge, die nicht als Teil eines Datums erkannt werden, ignoriert werden.

from dateutil.parser import parse

dt = parse("Today is January 1, 2047 at 8:21:00AM", fuzzy=True)
print(dt)

dt ist jetzt ein datetime Objekt, und datetime.datetime(2047, 1, 1, 8, 21) gedruckt.

Zwischen Zeitzonen wechseln

Um zwischen Zeitzonen zu wechseln, benötigen Sie datetime-Objekte, die Zeitzonen berücksichtigen.

from datetime import datetime
from dateutil import tz

utc = tz.tzutc()
local = tz.tzlocal()

utc_now = datetime.utcnow()
utc_now # Not timezone-aware.

utc_now = utc_now.replace(tzinfo=utc)
utc_now # Timezone-aware.

local_now = utc_now.astimezone(local)
local_now # Converted to local time.

Parsen eines beliebigen ISO 8601-Zeitstempels mit minimalen Bibliotheken

Python unterstützt die Analyse von Zeitstempeln nach ISO 8601 nur eingeschränkt. Für strptime Sie genau wissen, in welchem ​​Format es sich befindet. Als Komplikation ist die Stringifizierung einer datetime ein Zeitstempel nach ISO 8601 mit Leerzeichen als Trennzeichen und 6-stelligem Bruch:

str(datetime.datetime(2016, 7, 22, 9, 25, 59, 555555))
# '2016-07-22 09:25:59.555555'

Ist der Bruch 0, wird kein Bruchteil ausgegeben

str(datetime.datetime(2016, 7, 22, 9, 25, 59, 0))
# '2016-07-22 09:25:59'

Diese beiden Formulare benötigen jedoch ein anderes Format für die strptime . Darüber hinaus unterstützt strptime' does not support at all parsing minute timezones that have a Folgendes enthalten: in it, thus 2016-07-22 09: 25: 59 + 0300 can be parsed, but the standard format 2016-07-22 09:25:59 +03: 00` kann nicht.

Es gibt eine Einzeldateibibliothek namens iso8601 die nur Zeitstempel von ISO 8601 und nur sie richtig analysiert.

Es unterstützt Brüche und Zeitzonen und das T Trennzeichen mit einer einzigen Funktion:

import iso8601
iso8601.parse_date('2016-07-22 09:25:59')
# datetime.datetime(2016, 7, 22, 9, 25, 59, tzinfo=<iso8601.Utc>)
iso8601.parse_date('2016-07-22 09:25:59+03:00')
# datetime.datetime(2016, 7, 22, 9, 25, 59, tzinfo=<FixedOffset '+03:00' ...>)
iso8601.parse_date('2016-07-22 09:25:59Z')
# datetime.datetime(2016, 7, 22, 9, 25, 59, tzinfo=<iso8601.Utc>)
iso8601.parse_date('2016-07-22T09:25:59.000111+03:00')
# datetime.datetime(2016, 7, 22, 9, 25, 59, 111, tzinfo=<FixedOffset '+03:00' ...>)

Wenn keine Zeitzone eingestellt ist, wird der iso8601.parse_date auf UTC gesetzt. Die Standardzone kann mit default_zone Schlüsselwortargument default_zone geändert werden. Bemerkenswert ist , wenn dies None anstelle des Standard, dann werden diese Zeitstempel , die stattdessen als naive Datetimes keine explizite Zeitzone haben werden zurückgegeben:

iso8601.parse_date('2016-07-22T09:25:59', default_timezone=None)
# datetime.datetime(2016, 7, 22, 9, 25, 59)
iso8601.parse_date('2016-07-22T09:25:59Z', default_timezone=None)
# datetime.datetime(2016, 7, 22, 9, 25, 59, tzinfo=<iso8601.Utc>)

Zeitstempel in Datumszeit konvertieren

Das datetime Modul kann einen POSIX- timestamp in ein ITC- datetime Objekt datetime .

Die Epoche ist am 1. Januar 1970 um Mitternacht.

import time
from datetime import datetime
seconds_since_epoch=time.time()  #1469182681.709

utc_date=datetime.utcfromtimestamp(seconds_since_epoch) #datetime.datetime(2016, 7, 22, 10, 18, 1, 709000)

Monate genau von einem Datum abziehen

Verwenden des calendar

import calendar
from datetime import date

def monthdelta(date, delta):
    m, y = (date.month+delta) % 12, date.year + ((date.month)+delta-1) // 12
    if not m: m = 12
    d = min(date.day, calendar.monthrange(y, m)[1])
    return date.replace(day=d,month=m, year=y)

next_month = monthdelta(date.today(), 1) #datetime.date(2016, 10, 23)

Verwenden des dateutils Moduls

import datetime
import dateutil.relativedelta

d = datetime.datetime.strptime("2013-03-31", "%Y-%m-%d")
d2 = d - dateutil.relativedelta.relativedelta(months=1)  #datetime.datetime(2013, 2, 28, 0, 0)

Zeitunterschiede berechnen

Das timedelta Modul ist nützlich, um Unterschiede zwischen den Zeiten zu berechnen:

from datetime import datetime, timedelta
now = datetime.now()
then = datetime(2016, 5, 23)     # datetime.datetime(2016, 05, 23, 0, 0, 0)

Die Angabe der Uhrzeit ist optional, wenn ein neues datetime Objekt erstellt wird

delta = now-then

delta ist vom Typ timedelta

print(delta.days)
# 60
print(delta.seconds)
# 40826

Um einen Tag nach dem Tag und einen Tag vor dem Datum zu erhalten, könnten wir Folgendes verwenden:

n Tag nach dem Datum:

def get_n_days_after_date(date_format="%d %B %Y", add_days=120):

    date_n_days_after = datetime.datetime.now() + timedelta(days=add_days)
    return date_n_days_after.strftime(date_format)

n Tage vor dem Datum:

 def get_n_days_before_date(self, date_format="%d %B %Y", days_before=120):

        date_n_days_ago = datetime.datetime.now() - timedelta(days=days_before)
        return date_n_days_ago.strftime(date_format)

Erhalten Sie einen Zeitstempel nach ISO 8601

Ohne Zeitzone mit Mikrosekunden

from datetime import datetime

datetime.now().isoformat()
# Out: '2016-07-31T23:08:20.886783'

Mit Zeitzone, mit Mikrosekunden

from datetime import datetime
from dateutil.tz import tzlocal

datetime.now(tzlocal()).isoformat()
# Out: '2016-07-31T23:09:43.535074-07:00'

Mit Zeitzone, ohne Mikrosekunden

from datetime import datetime
from dateutil.tz import tzlocal

datetime.now(tzlocal()).replace(microsecond=0).isoformat()
# Out: '2016-07-31T23:10:30-07:00'

Siehe ISO 8601 für weitere Informationen über die ISO 8601 - Format.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow