前言
我有个用 Matlab 实现的量化回测程序,读取和操作的数据文件基本上是 mat 文件或 csv 文件。本文记录下如何在 Python 上操作 mat 文件。
数据说明
用的 mat 文件结构如下图:
Python 代码说明
from datetime import datetime, timedelta
import scipy.io
def main():
# Matlab 的数据文件
data_file = './data.mat'
# 读取数据文件
mat_data = scipy.io.loadmat(data_file)
# 输出所有的 key
print("keys:", mat_data.keys())
# 排除"__"开头的元信息key,并显示对应 key 的类型
for key in mat_data:
if not key.startswith('__'): # 排除元信息(如 __header__ 等)
var = mat_data[key]
print(f"Key: '{key}', dtype: {var.dtype}")
# 指定 key
key = 'mainContractExpiryStruct'
# 输出对应的类型
print(type(mat_data[key]))
# 输出对应的数据类型
print(mat_data[key].dtype)
field = 'dateNum'
# 输出对应 field 的类型
print(type(mat_data[key][field]))
# 输出对应 field 的数据类型
print(mat_data[key][field].dtype)
# 输出对应 field 的数据
print(mat_data[key]['mainContractExpiryMat'])
print(mat_data[key]['tickers'])
print(mat_data[key]['dateNum'])
# 输出具体的数据值
print(mat_data[key][field][0][0][0][0])
num_date = int(mat_data[key][field][0][0][0][0])
base_date = datetime(1, 1, 1) + timedelta(days=(num_date - 1 - 366))
formatted_date = base_date.strftime("%Y-%m-%d")
print(formatted_date)
# 修改指定的数据
mat_data[key][field][0][0][0][0] = 100
print(mat_data[key][field][0][0][0][0])
# 保存到新的文件
new_data_file = './new_data.mat'
scipy.io.savemat(new_data_file, mat_data)
if __name__ == '__main__':
main()