2017-01-05 68 views
3

我需要使用to_json方法将Pandas DataFrame序列化为JSON。下面是一个如何我现在做的是例如:使用上面的代码中我看到我的数据框已被保存到磁盘,该指数看起来像如何在使用JSON序列化/反序列化Pandas DataFrame时保留索引的时区

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') 

: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属性?

回答

1

当使用to_json时,熊猫会将一切转换为UTC。

参见本实施例中,我将其更改为Europe/Paris这是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')