Ich habe ein Python- datetime.datetime
Objekt. Was ist der beste Weg, um einen Tag zu subtrahieren?
Ich habe ein Python- datetime.datetime
Objekt. Was ist der beste Weg, um einen Tag zu subtrahieren?
Antworten:
Sie können ein Timedelta- Objekt verwenden:
from datetime import datetime, timedelta
d = datetime.today() - timedelta(days=days_to_subtract)
timedelta(minutes=12)
zum Beispiel mit verwendet.
import datetime as DT; DT.datetime.today()
sowohl auf Python 2 als auch auf Python 3 funktionieren DT.datetime.now()
.
Wenn Ihr Python-Datum / Uhrzeit-Objekt zeitzonenabhängig ist, sollten Sie darauf achten, Fehler bei Sommerzeitübergängen (oder Änderungen des UTC-Versatzes 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
Im Allgemeinen day_ago
und yesterday
kann abweichen, wenn sich der UTC-Offset für die lokale Zeitzone am letzten Tag geändert hat.
Beispielsweise endet die Sommerzeit / Sommerzeit am 2. November 2014 um 02:00:00 Uhr in der Zeitzone America / 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
und yesterday
unterscheiden:
day_ago
ist genau vor 24 Stunden (relativ zu now
) aber um 11 Uhr, nicht um 10 Uhr alsnow
yesterday
ist gestern um 10 Uhr, aber es ist 25 Stunden her (relativ zu now
), nicht 24 Stunden.pendulum
Modul behandelt es 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 um eine alternative Methode und einen Anwendungsfall zu erarbeiten, für die es hilfreich ist:
from datetime import datetime, timedelta print datetime.now() + timedelta(days=-1) # Here, I am adding a negative timedelta
from datetime import datetime, timedelta print datetime.now() + timedelta(days=5, hours=-5)
Es kann in ähnlicher Weise mit anderen Parametern verwendet werden, z. B. Sekunden, Wochen usw.
Auch nur eine weitere nette Funktion, die ich gerne benutze, wenn ich den ersten / letzten Tag des letzten Monats oder andere relative Zeitpläne usw. berechnen möchte ... ...
Die relativedelta-Funktion von dateutil (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