微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在使用JSON序列化/反序列化Pandas DataFrame时,如何保留索引的时区

我需要使用to_json方法将Pandas DataFrame序列化为JSON.这是我如何做到这一点的一个例子:

import pandas
import numpy as np
dr = pandas.date_range('2016-01-01T12:30:00Z', '2016-02-01T12:30:00Z')
data = np.random.rand(len(dr), 2)
df = pandas.DataFrame(data, index=dr, columns=['a', 'b'])

# NOTE: The index for df has the following properties in pandas 0.19.2
#       dtype='datetime64[ns, UTC]', freq='D'

# Save to JSON
df.to_json('/tmp/test_data_01.json', date_unit='s', date_format='iso')

使用上面的代码,我看到我的DataFrame已保存到磁盘,并且索引如下:文件中的[2016-01-01T12:30:00Z,2016-01-02T12:30:00Z,…] TMP / test_data_01.json.

问题是,当我执行以下操作时:

df2 = pandas.read_json('/tmp/test_data_01.json')

df2的索引没有时区.

df2.index.tz
# Returns None

无论如何要保持序列化为JSON并反序列化的DataFrame的timezone属性

解决方法:

使用to_json时,Pandas会将所有内容转换为UTC.

请参阅此示例,我将其更改为欧洲/巴黎,即UTC 1:

In [1]:
dr = pd.date_range('2016-01-01T12:30:00Z', '2016-02-01T12:30:00Z')
dr = dr.tz_convert('Europe/Paris')
data = np.random.rand(len(dr), 2)
df = pd.DataFrame(data, index=dr, columns=['a', 'b'])

In [2]: df.index[0]
Out[2]: Timestamp('2016-01-01 13:30:00+0100', tz='Europe/Paris', freq='D')

In [3]: df.to_json('test_data_01.json', date_unit='s', date_format='iso')

如果我打开test_data_01.json,第一个是“2016-01-01T12:30:00Z”.

因此,当您加载json时,将其本地化为UTC.虽然事先没有办法知道tz是用过什么的:

In [4]:
df2 = pd.read_json('test_data_01.json')
df2.index = df2.index.tz_localize('UTC')

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐