我刚开始从Matlab迁移到Python 2.7,我在阅读我的.mat文件时遇到了一些麻烦 . 时间信息以Matlab的datenum格式存储 . 对于那些不熟悉它的人:
序列日期编号表示日历日期,作为自固定基准日期以来经过的天数 . 在MATLAB中,序列号1是0000年1月1日.MATLAB还使用序列时间来表示从午夜开始的天数;例如,下午6点等于0.75连续日 . 所以MATLAB中的字符串'31 -Oct-2003,6:00 PM'是日期号731885.75 . (取自Matlab文档)
我想将其转换为Pythons时间格式,我找到this tutorial . 简而言之,作者说明了这一点
如果你使用python的datetime.fromordinal(731965.04835648148)解析它,那么结果可能看起来合理[...]
(在任何进一步的转换之前),这对我不起作用,因为datetime.fromordinal需要一个整数:
>>> datetime.fromordinal(731965.04835648148)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: integer argument expected, got float
虽然我可以将它们整理成日常数据,但实际上我需要输入精确的时间序列 . 有没有人有这个问题的解决方案?我想避免重新格式化我的.mat文件,因为它们中有很多,我的同事也需要使用它们 .
如果有帮助,someone else asked for the other way round . 可悲的是,我对Python太新了,无法真正理解那里发生的事情 .
/ edit(2012-11-01):这已在上面发布的教程中修复 .
5 回答
使用pandas,可以在尊重小数部分的同时转换整个datenum值数组:
值719529是Unix纪元启动(1970-01-01)的datenum值,这是pd.to_datetime()的默认值
origin
.我使用以下Matlab代码来设置它:
只是 Build 并添加到以前的评论 . 关键是当天计数由
datetime
和类datetime
中的构造函数fromordinal
以及相关的子类执行 . 例如,从Python Library Reference for 2.7,一个读取fromordinal
但是,公元0年仍然是一个(跳跃)年份,因此仍有366天需要考虑 . (闰年,就像2016年,恰好是四年前的四十四年 . )
这些是我用于类似目的的两个功能:
希望这有助于并且乐于纠正 .
您链接到解决方案,它有一个小问题 . 就是这个:
更长的解释可以找到here
为了防止对其他人有用,这里有一个从Matlab mat文件加载时间序列数据的完整示例,使用carlosdc的答案(定义为函数)将Matlab datenums的向量转换为日期时间对象列表,然后绘制为与熊猫的时间序列:
这是使用
numpy.datetime64
而不是datetime
转换它们的方法 .这适用于
serdate
单个整数或整数数组 .