Tengo time = '2020-06-24T13:30:00-04:00'. ¿Cómo puedo cambiarlo a un objeto dateTime en hora UTC? Preferiría no usar pd.Timestamp(time).tz_convert("UTC").to_pydatetime() porque devuelve un resultado extraño que se vería así datetime.datetime(2020, 6, 24, 17, 30, tzinfo=<UTC>). Como resultado, cuando verifico la igualdad con datetime.datetime(2020, 6, 24, 17, 30), devuelve False.

Editar:

import datetime
import pytz

time = '2020-06-24T13:30:00-04:00

dt = datetime.datetime(2020, 6, 24, 17, 30)
print("dt: ",dt)

so = datetime.datetime.strptime(time, '%Y-%m-%dT%H:%M:%S%z').astimezone(pytz.utc)
print("so:",so)

print(dt == so)

Salidas

dt: 2020-06-24 17:30:00
so: 2020-06-24 17:30:00+00:00
False

¿Cómo puedo hacer que se evalúe correctamente como Verdadero?

0
Danlo9 24 jun. 2020 a las 19:25

2 respuestas

La mejor respuesta

# 1 Dado que su cadena es ISO 8601 compatible, utilice {{ X0}} en Python 3.7+:

from datetime import datetime, timezone

s = '2020-06-24T13:30:00-04:00'

dtobj = datetime.fromisoformat(s)
# dtobj
# datetime.datetime(2020, 6, 24, 13, 30, tzinfo=datetime.timezone(datetime.timedelta(days=-1, seconds=72000)))

Tenga en cuenta que esto le dará un objeto datetime con reconocimiento de zona horaria; la propiedad tzinfo es un desplazamiento UTC. Puede convertirlo fácilmente a UTC usando astimezone():

dtobj_utc = dtobj.astimezone(timezone.utc)
# dtobj_utc
# datetime.datetime(2020, 6, 24, 17, 30, tzinfo=datetime.timezone.utc)

# 2 Puede lograr lo mismo con strptime (también Python3.7 + según esto):

dtobj = datetime.strptime(s, '%Y-%m-%dT%H:%M:%S%z')
dtobj_utc = dtobj.astimezone(timezone.utc)
# dtobj_utc
# datetime.datetime(2020, 6, 24, 17, 30, tzinfo=datetime.timezone.utc)

# 3 Si desea convertir el resultado en un objeto de fecha y hora ingenuo, es decir, eliminar la propiedad tzinfo, reemplace con None:

dtobj_utc_naive = dtobj_utc.replace(tzinfo=None)
# dtobj_utc_naive
# datetime.datetime(2020, 6, 24, 17, 30)

# 4 Para versiones anteriores de Python, debería poder usar el analizador de dateutil:

from dateutil import parser
dtobj = parser.parse(s)
dtobj_utc = dtobj.astimezone(timezone.utc)
dtobj_utc_naive = dtobj_utc.replace(tzinfo=None)
# dtobj_utc_naive
# datetime.datetime(2020, 6, 24, 17, 30)
0
MrFuppes 24 jun. 2020 a las 17:59

Bien, mi respuesta anterior fue una especie de sorpresa porque no entendí su problema por completo, así que lo estoy reescribiendo. Su problema es que está construyendo un objeto de fecha y hora a partir de una cadena y es consciente de la zona horaria (UTC). Sin embargo, cada vez que crea un objeto datetime en python, dt = datetime.datetime(2020, 6, 24, 17, 30), lo está creando pero sin información de zona horaria (que puede verificar usando .tzinfo en él). Todo lo que debe hacer es tener en cuenta la zona horaria dt cuando la cree por primera vez. Vea a continuación mi snippit de código.


import datetime

time = '2020-06-24T13:30:00-04:00'

dt = datetime.datetime(2020, 6, 24, 17, 30, tzinfo=datetime.timezone.utc)

print("dt: ",dt.tzinfo)

so = datetime.datetime.strptime(time, '%Y-%m-%dT%H:%M:%S%z')

print("so:",so.tzinfo)

print(dt == so)

0
Edwin Cruz 24 jun. 2020 a las 17:52