【问题标题】:How to import dates correctly from this .csv file into Matlab?如何将此 .csv 文件中的日期正确导入 Matlab?
【发布时间】:2020-08-26 06:01:34
【问题描述】:

我有一个 .csv 文件,其中第一列包含日期,其 sn-p 如下所示:

date,values
03/11/2020,1
03/12/2020,2
3/14/20,3
3/15/20,4
3/16/20,5
04/01/2020,6

我想将这些数据导入 Matlab(我认为最好的方法可能是使用 readtable() 函数,see here)。我的目标是将日期作为datetime array 带入Matlab。正如您在上面看到的,问题在于原始 .csv 文件中的日期格式不一致。其中一些格式为mm/dd/yyyy,其中一些格式为mm/dd/yy

简单地在 .csv 文件上调用 data = readtable('myfile.csv') 会导致以下结果,这是不正确的:

'03/11/2020'    1
'03/12/2020'    2
'03/14/0020'    3
'03/15/0020'    4
'03/16/0020'    5
'04/01/2020'    6

有人知道在导入时自动考虑此类数据的方法吗?

谢谢!

我的版本:Matlab R2017a

编辑 ---------------------------------------

按照 Max 的建议,我尝试使用以下命令为读取命令指定一些输入选项:

T = readtable('example.csv',...
              'Format','%{dd/MM/yyyy}D %d',...
              'Delimiter', ',',...
              'HeaderLines', 0,...
              'ReadVariableNames', true)

导致:

    date       values
    __________    ______

    03/11/2020    1     
    03/12/2020    2     
    NaT           3     
    NaT           4     
    NaT           5     
    04/01/2020    6     

你可以看到这也不起作用。

【问题讨论】:

    标签: matlab csv import


    【解决方案1】:

    与其明确指定格式(我之前也建议过),不如使用 delimiterImportoptions,如果是 csv 文件,则使用 delimitedTextImportOptions

    opts = delimitedTextImportOptions('NumVariables',2,...% how many variables per row?
    'VariableNamesLine',1,... % is there a header? If yes, in which line are the variable names?
    'DataLines',2,... % in which line does the actual data starts?
    'VariableTypes',{'datetime','double'})% as what data types should the variables be read
    
    readtable('myfile.csv',opts)
    

    因为整洁的小功能会自动识别datetime 的格式,因为它知道它必须是datetime-object =)

    【讨论】:

      【解决方案2】:

      如果您确定所有涉及的日期不超过 100 年,您可以轻松应用上个世纪使用的枢轴方法(在 2K 错误警告世界该方法的危险之前) .

      他们过去只用 2 位数字编码日期,知道 87 实际上意味着 1987。用户(或计算机)会自动添加缺失的年份。

      在您的情况下,您可以阅读完整的表格,解析日期,然后很容易检测出哪些日期不一致。识别它们,纠正它们,然后你就可以开始了。

      用你的例子:

      a = readtable(tfile) ;                  % read the file
      dates = datetime(a.date) ;              % extract first column and convert to [datetime]
      idx2change = dates.Year < 2000 ;        % Find which dates where on short format
      dates.Year(idx2change) = dates.Year(idx2change) + 2000 ; % Correct truncated years
      a.date = dates                          % reinject corrected [datetime] array into the table
      

      产量:

      a = 
             date        values
          ___________    ______
          11-Mar-2020    1     
          12-Mar-2020    2     
          14-Mar-2020    3     
          15-Mar-2020    4     
          16-Mar-2020    5     
          01-Apr-2020    6     
      

      【讨论】:

      • 好的,很简单的解决方案。我会接受的! +1作为背景。出于兴趣,您不知道在导入过程中是否有自动检测选项?
      • 我怀疑您是否可以简单地在readtable 参数中设置一个选项,它可以为您解决这个问题。但即使对我来说,我也不使用高级导入函数并编写自己的解析器,而且我经常遇到同样的问题。即使在我的解析器中,我也会尽可能多地阅读,并在稍后阶段进行更正。它通常比逐行检查/验证要快得多。
      • 以后我会尽量听从你的建议,谢谢。
      猜你喜欢
      • 2021-06-23
      • 2018-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-12
      • 2019-11-25
      • 2017-10-11
      相关资源
      最近更新 更多