Extraño problema de zona horaria con pytz
>>> import pytz
>>> pytz.timezone('Asia/Hong_Kong')
<DstTzInfo 'Asia/Hong_Kong' LMT+7:37:00 STD>
¿Un desplazamiento de siete horas y 37 minutos? Esto es un poco extraño, ¿alguien experimenta el mismo problema?
De hecho, estoy teniendo un comportamiento diferente entre
import pytz
from datetime import datetime
hk = pytz.timezone('Asia/Hong_Kong')
dt1 = datetime(2012,1,1,tzinfo=hk)
dt2 = hk.localize(datetime(2012,1,1))
if dt1 > dt2:
print "Why?"
Las zonas horarias y las compensaciones cambian a lo largo de los años. El nombre de zona predeterminado y el desplazamiento entregado cuando Pytz crea un objeto de zona horaria son los primeros disponibles para esa zona y, a veces, pueden parecer un poco extraños. Cuando utiliza localize
para adjuntar la zona a una fecha, se sustituyen el nombre de zona y el desplazamiento adecuados. Simplemente usar el datetime
constructor para adjuntar la zona a la fecha no permite que se ajuste correctamente.
Al llegar aquí casi 10 años después, creo que vale la pena señalar que ahora podemos utilizar exclusivamente la biblioteca estándar Python 3.9+ para manejar zonas horarias, sin una "trampa de localización".
Utilice el módulo Zoneinfo para configurar y reemplazar tzinfo como desee, por ejemplo:
from datetime import datetime
from zoneinfo import ZoneInfo
hk = ZoneInfo('Asia/Hong_Kong')
print(repr(hk))
# zoneinfo.ZoneInfo(key='Asia/Hong_Kong')
dt1 = datetime(2012,1,1,tzinfo=hk)
print(dt1)
# 2012-01-01 00:00:00+08:00
- hay una cuña de desaprobación para
pytz
Alternativas, si no puedes usar zoneinfo
:
- para Python <3.9, hay backports.zoneinfo
- También puedes usar dateutil , que sigue la misma semántica que
zoneinfo
Nota para pandas
los usuarios:
pandas
(v1.4.1) todavía se usapytz
internamente y parece tener algunos problemas con los objetos de zona horaria ZoneInfo