pandas如何覆盖timezome本地化的属性错误

kokeuurv  于 2023-06-20  发布在  其他
关注(0)|答案(1)|浏览(105)

我有一个idaydf.index,我正在尝试本地化时区

DatetimeIndex(['2022-10-24 16:00:00', '2022-10-24 16:15:00',
               ...
               '2023-06-16 21:58:00', '2023-06-16 22:00:00'],
              dtype='datetime64[ns]', name='DateTime', length=9012, freq=None)

idaydf.index = idaydf.index.tz_localize(LOCAL_TZ)

其中LOCAL_TZ是

_PytzShimTimezone(zoneinfo.ZoneInfo(key='Europe/London'), 'Europe/London')

我得到这个错误:

*** AttributeError: 'NoneType' object has no attribute 'total_seconds'

我有这些版本:

python3-3.11.3
pandas-1.5.3
pytz-2023.3-1
tzlocal 4.2

如何修复?

7fyelxc5

7fyelxc51#

可以使用timezone对象的字符串表示来解耦。那样的话

  • pandas可以选择它想要的任何库来处理时区(他们应该在2023年从pytz切换到zoneinfo)
  • 生成LOCAL_TZ的库可以切换到zoneinfo而不会使代码崩溃
  • 你可以避免try/except s

例如:

from zoneinfo import ZoneInfo
import pytz_deprecation_shim as pds
import pandas as pd

LOCAL_TZ = pds.timezone('Europe/London')
print(repr(LOCAL_TZ))
# _PytzShimTimezone(zoneinfo.ZoneInfo(key='Europe/London'), 'Europe/London')

LOCAL_TZ_new = ZoneInfo('Europe/London')
print(repr(LOCAL_TZ_new))
# zoneinfo.ZoneInfo(key='Europe/London')

dti = pd.date_range('2022-10-24 16:00:00', '2023-06-16 22:00:00')

dti0 = dti.tz_localize(str(LOCAL_TZ))
dti1 = dti.tz_localize(str(LOCAL_TZ_new))

assert (dti0 == dti1).all()

tzlocal提供了一种直接获取字符串形式的IANA tz名称的方法,这可能会使这里的操作变得更容易-

from tzlocal import get_localzone_name
get_localzone_name()
# "Europe/Berlin" # on my machine...

这在tzlocal4.2版中已经可以工作了

相关问题