Python 在csv中正确保存和加载数据帧,同时保留datetimeindex的频率

Python 在csv中正确保存和加载数据帧,同时保留datetimeindex的频率,python,pandas,csv,Python,Pandas,Csv,我试图保存一个数据帧并加载它。如果我打印出结果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(),

我试图保存一个数据帧并加载它。如果我打印出结果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
这对我的程序来说不是一个大问题,但仍然很烦人。
谢谢

这里的问题是您保存的数据帧有列

索引(['first',2],dtype='object')

但是您加载的数据帧具有列

索引(['first','2',dtype='object')

换句话说,原始数据帧的列具有整数
2
,但在使用
将其保存到_csv
并使用
读取_csv
将其加载回时,它被解析为字符串
'2'

通过断言的最简单修复方法是将第13行更改为:

columns=['first', '2'])

为了补充@jfaccioni answer,
freq
属性没有保留,这里有两个选项

快速制作一种简单的泡菜,可以保存所有东西:

a.to_pickle('test_df')
b = pd.read_pickle('test_df')
a.equals(b) # True
或者,您可以使用DatetimeIndex中的
推断\u freq
属性:

a.to_csv('test_df')
b.read_csv('test_df')
b.index.freq = b.index.inferred_freq

print(b.index.freq)  #<10 * Minutes>
a.to_csv('test_df'))
b、 读取csv(“测试df”)
b、 index.freq=b.index.freq
打印(b.索引频率)#

Hi,欢迎来到StackOverflow。哪一行正在报告错误?