![](/img/trans.png)
[英]Setting freq of pandas DatetimeIndex after DataFrame creation
[英]Save and load correctly pandas dataframe in csv while preserving freq of datetimeindex
我试图保存 DataFrame 并加载它。 如果我打印结果 df,我发现它们(几乎)是相同的。 但是 datetimeindex 的 freq 属性没有被保留。
我的代码看起来像这样
import datetime
import os
import numpy as np
import pandas as pd
def test_load_pandas_dataframe():
idx = pd.date_range(start=datetime.datetime.now(),
end=(datetime.datetime.now()
+ datetime.timedelta(hours=3)),
freq='10min')
a = pd.DataFrame(np.arange(2*len(idx)).reshape((len(idx), 2)), index=idx,
columns=['first', 2])
a.to_csv('test_df')
b = load_pandas_dataframe('test_df')
os.remove('test_df')
assert np.all(b == a)
def load_pandas_dataframe(filename):
'''Correcty loads dataframe but freq is not maintained'''
df = pd.read_csv(filename, index_col=0,
parse_dates=True)
return df
if __name__ == '__main__':
test_load_pandas_dataframe()
我收到以下错误:
ValueError: Can only compare identically-labeled DataFrame objects
这对我的程序来说不是什么大问题,但它仍然很烦人。 谢谢!
这里的问题是您保存的 dataframe 有列
Index(['first', 2], dtype='object')
但是您加载的 dataframe 有列
Index(['first', '2'], dtype='object')
。
换句话说,原始 dataframe 的列具有 integer 2
,但是在使用 to_csv 保存并使用to_csv
将其加载回来read_csv
,它被解析为字符串'2'
。
通过您的断言的最简单的修复是将第 13 行更改为:
columns=['first', '2'])
为了补充@jfaccioni的答案,不保留freq
属性,这里有两个选项
快速使用简单的泡菜,它将保护一切:
a.to_pickle('test_df')
b = pd.read_pickle('test_df')
a.equals(b) # True
或者您可以使用 DatetimeIndex 中的inferred_freq
属性:
a.to_csv('test_df')
b.read_csv('test_df')
b.index.freq = b.index.inferred_freq
print(b.index.freq) #<10 * Minutes>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.