1184 Stimmen

Wie subtrahiert man einen Tag von einem Datum?

Ich habe eine Python datetime.datetime Objekt. Wie kann man am besten einen Tag subtrahieren?

1988voto

Steve B. Punkte 52372

Sie können eine timedelta Objekt:

from datetime import datetime, timedelta

d = datetime.today() - timedelta(days=days_to_subtract)

107voto

S.Lott Punkte 371691

Subtrahieren Sie datetime.timedelta(days=1)

97voto

jfs Punkte 370717

Wenn Ihr Python datetime-Objekt zeitzonenkompatibel ist, sollten Sie darauf achten, Fehler bei der Umstellung auf die Sommerzeit (oder Änderungen des UTC-Offsets aus anderen Gründen) zu vermeiden:

from datetime import datetime, timedelta
from tzlocal import get_localzone # pip install tzlocal

DAY = timedelta(1)
local_tz = get_localzone()   # get local timezone
now = datetime.now(local_tz) # get timezone-aware datetime object
day_ago = local_tz.normalize(now - DAY) # exactly 24 hours ago, time may differ
naive = now.replace(tzinfo=None) - DAY # same time
yesterday = local_tz.localize(naive, is_dst=None) # but elapsed hours may differ

Generell, day_ago y yesterday kann abweichen, wenn sich der UTC-Offset für die lokale Zeitzone am letzten Tag geändert hat.

Zum Beispiel endet die Sommerzeit am Sun 2-Nov-2014 um 02:00:00 A.M. in der Zeitzone Amerika/Los_Angeles, wenn:

import pytz # pip install pytz

local_tz = pytz.timezone('America/Los_Angeles')
now = local_tz.localize(datetime(2014, 11, 2, 10), is_dst=None)
# 2014-11-02 10:00:00 PST-0800

dann day_ago y yesterday unterschiedlich:

  • day_ago ist genau 24 Stunden her (relativ zu now ), aber um 11 Uhr, nicht um 10 Uhr wie now
  • yesterday ist gestern um 10 Uhr, aber es ist 25 Stunden her (relativ zu now ), nicht 24 Stunden.

pendulum Modul übernimmt dies automatisch:

>>> import pendulum  # $ pip install pendulum

>>> now = pendulum.create(2014, 11, 2, 10, tz='America/Los_Angeles')
>>> day_ago = now.subtract(hours=24)  # exactly 24 hours ago
>>> yesterday = now.subtract(days=1)  # yesterday at 10 am but it is 25 hours ago

>>> (now - day_ago).in_hours()
24
>>> (now - yesterday).in_hours()
25

>>> now
<Pendulum [2014-11-02T10:00:00-08:00]>
>>> day_ago
<Pendulum [2014-11-01T11:00:00-07:00]>
>>> yesterday
<Pendulum [2014-11-01T10:00:00-07:00]>

54voto

Sahil kalra Punkte 7248

Nur zur Verdeutlichung einer alternativen Methode und einen Anwendungsfall, für den es hilfreich ist:

  • Subtrahiert 1 Tag vom aktuellen Datum:
from datetime import datetime, timedelta
print datetime.now() + timedelta(days=-1)  # Here, I am adding a negative timedelta
  • Nützlich für den Fall Wenn Sie 5 Tage addieren und 5 Stunden von der aktuellen Datumszeit abziehen wollen, d.h. wie lautet die Datumszeit in 5 Tagen, aber 5 Stunden weniger?
from datetime import datetime, timedelta
print datetime.now() + timedelta(days=5, hours=-5)

Sie kann auch mit anderen Parametern verwendet werden, z. B. Sekunden, Wochen usw.

16voto

PlagTag Punkte 5094

Auch nur eine weitere nette Funktion, die ich gerne verwende, wenn ich z.B. den ersten/letzten Tag des letzten Monats oder andere relative Zeitpunkte usw. berechnen möchte ...

Die Relativedeltafunktion von dateutil Funktion (eine leistungsstarke Erweiterung der datetime lib)

import datetime as dt
from dateutil.relativedelta import relativedelta
#get first and last day of this and last month)
today = dt.date.today()
first_day_this_month = dt.date(day=1, month=today.month, year=today.year)
last_day_last_month = first_day_this_month - relativedelta(days=1)
print (first_day_this_month, last_day_last_month)

>2015-03-01 2015-02-28

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X