Matlab:将带毫秒的文件日期转换为Matlab时间格式

Matlab: Convert file date with milliseconds into Matlab time format

我有一些日期格式为

的文本文件

2015-09-08 14:38:03

2015-09-08 14:38:03.1

2015-09-08 14:38:03.2

我想转换成 Matlab date/time 格式。如您所见,文本字符串具有不同的毫秒时间格式。在第一种情况下,没有给出毫秒;在秒的情况下,毫秒仅以一位数字给出。这为测量数据提供了 20Hz 的采样率。

到目前为止,只有

x = datenum(file.dateColumn, 'yyyy-mm-dd HH:MM:SS');

正在工作,但当然会错过毫秒。像

这样的转换

x = datenum(file.dateColumn, 'yyyy-mm-dd HH:MM:SS.FFF');

不起作用,因为毫秒为零(整秒)或在“.”后有一位数字。定界符。像

这样的解决方法

x = datestr(file.dateColumn, 'yyyy-mm-dd HH:MM:SS.FFF');

x = datenum(file.dateColumn, 'yyyy-mm-dd HH:MM:SS.FFF');

即将文本字符串转换为 Matlab 字符串(并为其添加额外的 FFF/FF 数字),然后将该字符串转换为 date/time 数字即可——但这太耗时了,我无法将其用于我的数据.我在不同的文件中有数百万个时间行。

你有什么想法吗?

你好,阿恩

您可以尝试类似的方法:

a='2015-09-08 14:38:03';
s=strsplit(a,{'-',':',' '})
x=datenum(cellfun(@str2num,s(1:end)))

我强烈推荐使用新的 datetime 对象:

strings = {'2015-09-08 14:38:03', '2015-09-08 14:38:03.1', '2015-09-08 14:38:03.2'};
dates = {};

for d = strings
    d = d{1};

    try
        dt = datetime(d, 'inputformat', 'yyyy-MM-dd HH:mm:ss.S');
    catch
        dt = datetime(d, 'inputformat', 'yyyy-MM-dd HH:mm:ss');
    end

    dates{end + 1} = dt;
end

>> dates

dates =

[08-Sep-2015 14:38:03]    [08-Sep-2015 14:38:03]    [08-Sep-2015 14:38:03]

>> dates{end}.Second

ans =

    3.2000

也很容易从 datetime 对象转换为 datenum:

>> x = [datetime('now'), datetime('yesterday')]
x = 
   10-Dec-2015 12:53:40   09-Dec-2015 00:00:00
>> datenum(x)
ans =
   1.0e+05 *
    7.3631    7.3631
>> 

感谢 Nick,我找到了解决问题的方法:

dataVelPres = readtable(fileName, ...
    'ReadVariableNames', false, ...
    'HeaderLines', 4 );

dataVelPres.Properties.VariableNames = {'date' 'velU' 'velV' 'velW' 'pres'};

dateMill = datetime(dataVelPres.date, 'inputformat', 'yyyy-MM-dd HH:mm:ss.S');
dateFull = datetime(dataVelPres.date, 'inputformat', 'yyyy-MM-dd HH:mm:ss');

dateNaT = isnat(dateMill);
dateMill(dateNaT) = dateFull(dateNaT);
dataVelPres.dateTime = dateMill;
dataVelPres.date = datenum(dataVelPres.dateTime); % Convert to number format if needed

这适用于两个表 - 一个用于毫秒。和一个没有 - 并将两者放在一起,因为两者都提供 NaT 条目以防输入格式不匹配。

有没有更优雅的方式?