从Matlab时间戳日期转换为Python时间戳日期

时间:2015-10-11 13:53:13

标签: python matlab date numpy matrix

我在MATLAB中有一个带有(72500,1)维度的时间戳矩阵。我在MATLAB中写了这样一个声明:

returnMatrix = datestr(M(:,1)/86400 + datenum(1970,1,1)- 4/24);

我成功地将输出日期矩阵作为返回矩阵返回。

returnMatrix = ['29/06/2015',...,'06/07/2015']

为了获得相同的输出,我在Python中编写了这样的语句:

returnMatrix = (M[:, 0] / 86400 + date.toordinal(date(1970, 1, 1)) + 366 - (4/24))
returnMatrix = np.apply_along_axis((lambda x:[date.fromtimestamp(x[0]).strftime("%d/%m/%y")]),1,returnMatrix)

但作为输出,我得到了这个结果:

returnMatrix = ['09/01/1970',...,'09/01/1970']

我应该如何编写语句以使输出成为MATLAB中的输出?

2 个答案:

答案 0 :(得分:1)

我从这个问题中理解的是,您有几秒钟的数据要添加到基准日期(1970年1月1日)并获得新日期。来自'datetime'模块的Python'timedelta'方法可以很方便地解决这个问题。

在这里,我提出了解决问题的方法


    import datetime
    base_date = datetime.datetime(1970,1,1,0,0,0)
    return_matrix = []
    for time in M:
        return_matrix.append(base_date + datetime.timedelta(seconds=time))


返回矩阵将包含所有日期。无需额外计算。

我假设数据保存在列表M中。我不明白你使用python列表的方式。您访问列表的方式,即M [:0]实际上将列表从第0个元素拆分为除第0个零之外的第0个元素。如果它是一维数据,那么你可以直接使用M我使用的方式。我认为你在MATLAB背景下感到困惑。

答案 1 :(得分:0)

鉴于M是包含秒数的numpy数组,如果您可以使用ISO8601格式的日期字符串,则可以执行此操作

dates = (M*numpy.timedelta64(1, 's') + 
         numpy.datetime64('1970-01-01T00:00') -
         numpy.timedelta64(4, 'h').astype('timedelta64[s]')).astype('datetime64[D]')

(那.astype可以压制关于隐式转换的警告。)