繁体   English   中英

在 csv 中正确保存和加载 pandas dataframe,同时保留 datetimeindex 的频率

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM