如何将datetime.datetime对象转换为可保存到.mat文件的数组?
问题:保存datetime数组到Matlab .mat文件时类型转换错误
你有一个包含datetime.datetime对象的numpy数组:
array([datetime.datetime(2011, 1, 1, 0, 3, 32, 262000), datetime.datetime(2011, 1, 1, 0, 5, 7, 290000), datetime.datetime(2011, 1, 1, 0, 6, 45, 383000), datetime.datetime(2011, 1, 1, 0, 8, 23, 335000)], dtype=object)
尝试用scipy.io.savemat保存时出现错误:
TypeError: Could not convert 2011-01-01 00:03:32.262000 (type <class 'datetime.datetime'>) to array
需要保留原时间格式而非转换为Unix时间戳,以下是可行的解决方法:
方法1:转换为numpy datetime64类型(推荐)
scipy.io.savemat原生支持numpy的datetime64类型,转换后Matlab加载时会自动识别为datetime对象,完整保留时间精度:
import numpy as np from scipy.io import savemat # 将datetime数组转换为微秒精度的datetime64(匹配原数据的微秒信息) dt64_array = np.array(time_array, dtype='datetime64[us]') save_structure = {'Time': dt64_array} # 注意路径转义,用双反斜杠或原始字符串 savemat(path + r'\2011.mat', save_structure)
方法2:拆分时间分量保存
将datetime对象的年、月、日、时、分、秒(含微秒)拆分为单独数组,在Matlab中可重新组合为datetime:
from scipy.io import savemat import numpy as np # 提取各时间分量 years = np.array([dt.year for dt in time_array]) months = np.array([dt.month for dt in time_array]) days = np.array([dt.day for dt in time_array]) hours = np.array([dt.hour for dt in time_array]) minutes = np.array([dt.minute for dt in time_array]) # 合并秒和微秒 seconds = np.array([dt.second + dt.microsecond / 1e6 for dt in time_array]) save_structure = { 'year': years, 'month': months, 'day': days, 'hour': hours, 'minute': minutes, 'second': seconds } savemat(path + r'\2011.mat', save_structure)
在Matlab中重建datetime:
Time = datetime(year, month, day, hour, minute, second);
方法3:使用pandas辅助转换
如果已安装pandas,可利用其DatetimeIndex快速转换:
import pandas as pd from scipy.io import savemat # 转换为pandas DatetimeIndex再转numpy数组 dt_index = pd.DatetimeIndex(time_array) dt64_array = dt_index.to_numpy() save_structure = {'Time': dt64_array} savemat(path + r'\2011.mat', save_structure)
或者直接用pandas的to_matlab方法:
df = pd.DataFrame({'Time': time_array}) df.to_matlab(path + r'\2011.mat')
内容的提问来源于stack exchange,提问作者Shivank Chadda
相关产品推荐
相关产品推荐

