【问题标题】:Can't transform matlab datenum format into python datetime with enough precision无法以足够的精度将 matlab datenum 格式转换为 python datetime
【发布时间】:2019-10-18 18:40:16
【问题描述】:

我有包含 datenum 值的 .mat 文件(即 735724.3229166666、735725.6756944444 等)。

我的目标是在不损失精度的情况下将其转换为日期时间格式,换句话说,它应该像使用 matlab 一样精确。

我非常清楚这些答案: Converting Matlab's datenum format to Python

但是它们都没有那么精确,因为 python 在几乎所有数值运算中都会在小数点后四舍五入。

例如,我写的那些函数是基于上面链接中的答案:

def datenum_to_datetime1(datenum):

    days = datenum % 1
    return datetime.fromordinal(int(datenum)) \
           + timedelta(days=days) \
           - timedelta(days=366)

def datenum_to_datetime2(datenum):

    days = np.float_(datenum) % 1
    return datetime.fromordinal(int(datenum)) \
           + timedelta(days=days) \
           - timedelta(days=366)

def datenum_to_datetime3(datenum):

    return pd.to_datetime(datenum-719529, unit='D')

def datenum_to_datetime4(datenum):

    origin = np.datetime64('0000-01-01', 'D') - np.timedelta64(1, 'D')
    date = datenum * np.timedelta64(1, 'D') + origin
    return date

如果我在 735724.3229166666 上试用它们,我会得到:

  • 2014-05-05 07:44:59.999997
  • 2014-05-05 07:44:59.999997
  • 2014-05-05 07:45:00.000028800
  • 2014-05-05

第三个选项是最精确的,但在 matlab 中它仍然不同。有人可以帮忙吗?

【问题讨论】:

  • 为什么您认为第三个选项是最好的?我假设您的输入是2014-05-05 07:45:00?如果是这样,它的误差为 2.8e-5,高于前两个结果的 3e-6。
  • @Daniel,我需要准确的分钟数,:59 和 :00 在我的情况下有所不同
  • 所以你对比秒更小的东西不感兴趣?如果是这样,请将您的时间四舍五入到最接近的秒数。

标签: python matlab datetime time


【解决方案1】:

我假设您输入的日期是2014-05-05 07:45:00。让我们看一下 MATLAB 存储日期的精度。它使用 64 位浮点数。在您拥有的值下,以秒为单位的精度为 eps(735724)*24*60*601.0058e-05。只要您在此数字的(一半)内看到错误,它们就已经存在于您的输入数据中,而不是由您的转换引起的。如果您需要更高的分辨率,则需要更高精度的输入数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    • 2016-09-08
    • 1970-01-01
    相关资源
    最近更新 更多