熊猫to_dict()丢失时区信息

时间:2020-05-18 01:50:45

标签: python-3.x pandas datetime timezone

我有一个数据库(SQLite),其日期时间已知为UTC。我知道SQLite不会存储tzinfo,但是它至少可以确保在提交数据库之前将其保存在UTC中,然后我知道在读取它时(通过read_sql),可以将日期强制为使用parse_dates选项将其读取为UTC。 然后,我可以根据需要执行操作,并使用tz_convert(<string>)将时区转换为某些输入字符串,并且可以使用正确的值(包括带有时区的新日期时间)将其打印到屏幕上,这表明它可以进行转换并且应该都不错。 。 除非随后我通过to_dict导出到字典,否则tz修改似乎丢失了,我回到了UTC。 我唯一想做的另一件事就是对字典的理解,以转换字典中的每个日期,这似乎很麻烦。即使数据集很小(只有大约500-600个条目),所以处理时间并不是真正重要的因素,我仍然想要一个优雅的解决方案。

def get_data(start_date, end_date, tz):
  result=db.query(
    TABLE
  ).filter(
    TABLE.start>=start_date,
    TABLE.start<=end_date,
  )

  df = pd.read_sql(result.statement, engine, parse_dates={"start":{"utc":True}, "end":{"utc":True}})

  df.set_index("start", drop=False, inplace=True)
  df.index  = df["start"].index.tz_convert(pytz.timezone(tz))

  return df.to_dict(orient="records")

在return语句之前打印df会显示修改的日期,该日期已更正为时区。但这在应用to_dict(和to_json)方法时似乎丢失了。

1 个答案:

答案 0 :(得分:0)

也许这是Python / pandas版本的问题? to_dict()将tz信息保持在我的计算机上(Win10,Python 3.8.3,pandas 1.0.3):

import pandas as pd
# pd.__version__
# '1.0.3'

# example series:
s = pd.Series(pd.date_range('2020-01-01', '2020-01-07', freq='H'))
# 0     2020-01-01 00:00:00
# 1     2020-01-01 01:00:00
# 2     2020-01-01 02:00:00
# 3     2020-01-01 03:00:00
# ...
# 144   2020-01-07 00:00:00

# localize to UTC:
s = s.dt.tz_localize('UTC')
# 0     2020-01-01 00:00:00+00:00
# ...
# 144   2020-01-07 00:00:00+00:00
# Length: 145, dtype: datetime64[ns, UTC]

# convert to US/Eastern:
s = s.dt.tz_convert('US/Eastern')
# 0     2019-12-31 19:00:00-05:00
# ...
# 144   2020-01-06 19:00:00-05:00
# Length: 145, dtype: datetime64[ns, US/Eastern]

# to dict:
d = s.to_dict()
# {0: Timestamp('2019-12-31 19:00:00-0500', tz='US/Eastern'),
#  1: Timestamp('2019-12-31 20:00:00-0500', tz='US/Eastern'),
#  2: Timestamp('2019-12-31 21:00:00-0500', tz='US/Eastern'),
#  3: Timestamp('2019-12-31 22:00:00-0500', tz='US/Eastern'),
#  ...
#  144: Timestamp('2020-01-06 19:00:00-0500', tz='US/Eastern')}