有的时候需要把 pandas 处理好的 DataFrame 进一步交给MATLAB来处理。当然可以保存成 excel 文件,不过当数据量比较大的时候,读取比较慢,这个时候转存成 MATLAB 可读的 mat 文件更合适(MATLAB 能快速读取)。
标准的操作就是 sio.savemat('filename.mat', {name: col.values for name, col in df.items()})
但需要注意两个问题。
DataFrame 里面不要有中文
>>> import pandas as pd
>>> from scipy import io as sio
>>> df = pd.DataFrame({'姓名': ['Mike', 'Jelly'], '年龄': [12, 13]})
>>> df
Out[5]: 姓名 年龄
0 Mike 12
1 Jelly 13
>>> sio.savemat('tmp.mat', {name: col.values for name, col in data_.items()})
Traceback ...
...
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-1: ordinal not in range(256)
如果出现中文会出现编码问题。建议改成英文。
Dataframe 中日期变量的存储
日期是不能直接存到 mat 文件中的,必须先转换成字符串再存。转字符串有两种方式。
-
df['time'] = df['time'].astype('str')
。这是比较推荐的方式,按照上述代码转存 mat 文件不会有任何问题。 -
df['time'] = df['time'].astype('string')
。不推荐这种方式,此时data['time'].values
就不是ndarray
类型了,而变成了StringArray
类型,这个是 pandas 特有的类型,转存到 mat 会无法识别,变成一堆浮点数。用这种方式转存时,这一列不能用col.values
,而应该用col.to_list()
转换成列表储存。