Skip to content

如何用 Python 操作 Matlab 的 mat 数据文件

Published: at 00:00

前言

我有个用 Matlab 实现的量化回测程序,读取和操作的数据文件基本上是 mat 文件或 csv 文件。本文记录下如何在 Python 上操作 mat 文件。

数据说明

用的 mat 文件结构如下图: [Pasted image 20250103164543.png] [Pasted image 20250103164714.png]

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()