【问题标题】:Matlab: Convert file date with milliseconds into Matlab time formatMatlab:将文件日期以毫秒为单位转换为 Matlab 时间格式
【发布时间】:2016-03-15 08:05:03
【问题描述】:

我有一些带有日期的文本文件

2015-09-08 14:38:03

2015-09-08 14:38:03.1

2015-09-08 14:38:03.2

我想转换成 Matlab 日期/时间格式。如您所见,文本字符串在毫秒方面具有不同的时间格式。在第一种情况下,没有给出毫秒;在秒的情况下,毫秒只给出一个数字。这为测量数据提供了 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 数字),然后将其转换为日期/时间数字是可行的 - 但这太费时了,我不能将它用于我的数据。我在不同的文件中有数百万个时间行。

你有什么想法吗?

你好,阿恩

【问题讨论】:

    标签: matlab time milliseconds


    【解决方案1】:

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

    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 条目。

    有没有更优雅的方式?

    【讨论】:

      【解决方案2】:

      你可以试试:

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

      【讨论】:

        【解决方案3】:

        我强烈推荐使用新的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
        >> 
        

        【讨论】:

        • 嗨尼克,这看起来很有趣。 1.)如何根据上述数据结构来完成,即行(一列)中的日期/时间?通过 readtable 函数读取数据。 2.) 之后我可以将其转换为 datenum 值吗?我正在使用 datenum 格式扩展扩展代码,我不想重写所有内容...
        • 关于1,你的意思是一个char矩阵?
        • 我不太确定 matlab 生成的格式。但最终数据存储在matlab表中。文本文件中的原始数据格式为“2015-09-08 14:38:03”,928132,24.92,999,999,999,1023,逐行给出数据。基准/时间在“ ”内的第一部分给出。我正在通过“dataVelPres = readtable(fileName, ..” 读取数据
        猜你喜欢
        • 1970-01-01
        • 2014-09-04
        • 1970-01-01
        • 2022-11-27
        • 1970-01-01
        • 1970-01-01
        • 2017-05-28
        • 1970-01-01
        • 2016-07-02
        相关资源
        最近更新 更多