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 条目以防输入格式不匹配。
有没有更优雅的方式?
我有一些日期格式为
的文本文件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 条目以防输入格式不匹配。
有没有更优雅的方式?