Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 如何识别和统一字符串中实例的日期格式?_String_Matlab_Date_Format - Fatal编程技术网

String 如何识别和统一字符串中实例的日期格式?

String 如何识别和统一字符串中实例的日期格式?,string,matlab,date,format,String,Matlab,Date,Format,我找不到一种方法来识别MATLAB中字符串的日期格式,并将它们全部放在相同的格式中。我有以下单元格数组: list = {'01-Sep-1882'; ... '01-Aug-1895'; ... '04/01/1912'; ... 'Tue, 05/28/46'; ... 'Tue, 03/10/53'; ... '06/20/58'; ... 'Thu, 09/20/73'; ...

我找不到一种方法来识别MATLAB中字符串的日期格式,并将它们全部放在相同的格式中。我有以下单元格数组:

list = {'01-Sep-1882'; ...
        '01-Aug-1895'; ...
        '04/01/1912'; ...
        'Tue, 05/28/46'; ...
        'Tue, 03/10/53'; ... 
        '06/20/58'; ...
        'Thu, 09/20/73'; ...
        'Fri, 08/15/75'; ...
        'Sun, 12/01/1996'};

如果我使用datenumlist,则会出现一条错误消息,因为所有行的日期格式都不相同。你能想出一种方法来避免这种情况吗?

这里的部分问题是MATLAB的datenum无法理解这种格式:Tue,05/28/46。因此,让我们清理原始列表,以便它能够理解

% original list
list = {'01-Sep-1882','01-Aug-1895','04/01/1912','Tue, 05/28/46','Tue, 03/10/53','06/20/58','Thu, 09/20/73','Fri, 08/15/75','Sun, 12/01/1996'}

% split each cell in the list
list_split = cellfun(@(x) strsplit(x,' '), list, 'UniformOutput', false);

% now detect where there is unusual format, this will give logical array
abnormal_idx = cellfun(@(x) length(x) == 2, list_split,'UniformOutput', true)

% make copy
clean_list = list;

% now at abnormal indices retain only the part that MATLAB understands
clean_list(abnormal_idx) = cellfun(@(x) x{2}, list_split(abnormal_idx), 'UniformOutput', false);

% now run datenum on clean list
date_num = cellfun(@datenum, clean_list, 'UniformOutput', true);

您可以通过依次应用来转换每种格式,并识别未正确转换的日期来完成此操作。此外,您可以在中指定一周中的几天,以及仅使用最后两个数字来指定几年中使用的内容。从问题中的示例数据和预期日期格式开始,下面是执行此操作的代码:

% Input:
list = {'01-Sep-1882'; ...
        '01-Aug-1895'; ...
        '04/01/1912'; ...
        'Tue, 05/28/46'; ...
        'Tue, 03/10/53'; ...
        '06/20/58'; ...
        'Thu, 09/20/73'; ...
        'Fri, 08/15/75'; ...
        'Sun, 12/01/1996'};

% Conversion code:
dt = datetime(list, 'Format', 'dd-MMM-yyyy');
index = isnat(dt);
dt(index) = datetime(list(index), 'Format', 'MM/dd/yy', 'PivotYear', 1900);
index = isnat(dt);
dt(index) = datetime(list(index), 'Format', 'eee, MM/dd/yy', 'PivotYear', 1900)

% Output:
dt = 

  9×1 datetime array

   01-Sep-1882
   01-Aug-1895
   01-Apr-1912
   28-May-1946
   10-Mar-1953
   20-Jun-1958
   20-Sep-1973
   15-Aug-1975
   01-Dec-1996
现在,您可以使用以下命令将这些值转换为数值:


列表是一个单元格数组吗?嗨@rayryeng,是的,它是。格式为:list='12/15/68''Sun,01/15/89'…执行此操作的一种方法是循环遍历单元格的每个元素,并分别对这些元素使用datenum。但是,如果在单元格数组中的任何元素上使用datenum,这些元素以字母形式开始:Tue、Thu、Fri等,后跟数字形式的日期,MATLAB目前没有内置的格式说明符来查找此类日期,因此它将在此处给您一个错误。丢弃这些数据并仅仅依赖于日期的数字形式是否安全?与@rayryeng一起,最简单且可能最不优雅的解决方案可能是简单地在单元格数组上循环,并将各个日期存储到新的numList。这将使numList成为一个很好的齐次数字数组,您可以随意处理。非常感谢您的建议!
dnum = datenum(dt);