Ich habe eine Python datetime.datetime
Objekt. Wie kann man am besten einen Tag subtrahieren?
Antworten
Zu viele Anzeigen?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 zunow
), aber um 11 Uhr, nicht um 10 Uhr wienow
yesterday
ist gestern um 10 Uhr, aber es ist 25 Stunden her (relativ zunow
), 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]>
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.
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
- See previous answers
- Weitere Antworten anzeigen