yyyy from create python datetime date

python - from - ¿Cómo restar un día de una fecha?



strftime python (6)

Genial módulo de flecha existe

import arrow utc = arrow.utcnow() utc_yesterday = utc.shift(days=-1) print(utc, ''/n'', utc_yesterday)

salida:

2017-04-06T11:17:34.431397+00:00 2017-04-05T11:17:34.431397+00:00

Tengo un objeto datetime.datetime Python. ¿Cuál es la mejor manera de restar un día?


Puedes usar un objeto timedelta :

from datetime import datetime, timedelta d = datetime.today() - timedelta(days=days_to_subtract)


Resta datetime.timedelta(days=1)


Si su objeto datetime de Python tiene en cuenta la zona horaria, debe tener cuidado de evitar errores en las transiciones DST (o cambios en el desplazamiento UTC por otras razones):

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

En general, day_ago y yesterday pueden diferir si el desplazamiento UTC para la zona horaria local ha cambiado en el último día.

Por ejemplo, el horario de verano / horario de verano termina el domingo 2 de noviembre de 2014 a las 02:00:00 AM en la zona horaria de América / Los_Angeles por lo tanto si:

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

entonces day_ago y yesterday difieren:

  • day_ago es exactamente hace 24 horas (en relación a now ) pero a las 11 am, no a las 10 am como now
  • yesterday es ayer a las 10 am pero es hace 25 horas (en relación con now ), no 24 horas.

pendulum módulo de pendulum maneja automáticamente:

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


Solo para elaborar un método alternativo y un caso de uso para el cual es útil:

  • Resta 1 día del tiempo actual:

from datetime import datetime, timedelta print datetime.now() + timedelta(days=-1) # Here, I am adding a negative timedelta

  • Útil en el caso , si desea agregar 5 días y restar 5 horas de la fecha actual. es decir, ¿cuál es el Datetime dentro de 5 días pero 5 horas menos?

from datetime import datetime, timedelta print datetime.now() + timedelta(days=5, hours=-5)

Se puede usar de forma similar con otros parámetros, por ejemplo, segundos, semanas, etc.


También es otra función interesante que me gusta usar cuando quiero calcular, es decir, el primer / último día del último mes u otros timedeltas relativos, etc. ...

La función relativedelta de la función dateutil (una poderosa extensión de la fecha y hora 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