Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.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 - Fatal编程技术网

String 将日期字符串(仅部分包含时间)的单元格数组转换为浮点

String 将日期字符串(仅部分包含时间)的单元格数组转换为浮点,string,matlab,date,String,Matlab,Date,我正在研究一些相当丑陋的代码,以实现以下目标: function [ Y ] = timeStringToFloat( X ) % X is a column cell-array of time-strings, e.g.: % % 4215×1 cell array % % '5/1/2009 3:02:00 PM' % '5/1/2009 4:11:00 PM' % '5/

我正在研究一些相当丑陋的代码,以实现以下目标:

function [ Y ] = timeStringToFloat( X )
    % X is a column cell-array of time-strings, e.g.:
    %
    %       4215×1 cell array
    % 
    %         '5/1/2009 3:02:00 PM'
    %         '5/1/2009 4:11:00 PM'
    %         '5/1/2009'                  <-- if time missing, assume '12:00:00 AM'
    %         '6/1/2009 12:37:00 AM'
    %         '7/1/2009 3:08:00 AM'
    %         '7/1/2009 9:30:00 PM'
    %         etc.
    % 
    % 
    %     >> Y
    % 
    %     Y =
    % 
    %        1.0e+05 *
    % 
    %        7.337786263888889
    %        7.337786743055555
    %        7.337786826388889
    %        7.337790256944444
    %        7.337801305555556
    %        7.337808958333333
    %        etc.
    %
    %
    % Convert Entry Times to date numbers, but we have to ensure that all entries contain
    % "HH:MM:SS PM" which is not the case for timestamps at 12:00:00 AM sharp.


    % For cells containing "AM" or "PM" Replace [] with 0
    IdxAM = strfind(X,'AM'); IdxAM(cellfun(@isempty,IdxAM)) = {0};
    IdxPM = strfind(X,'PM'); IdxPM(cellfun(@isempty,IdxPM)) = {0};

    % Entries without "HH:MM:SS PM" will be 0
    IdxNoTime = cell2mat(IdxAM) + cell2mat(IdxPM); 

    if min(IdxNoTime) == 0 % There is at least one entry without "HH:MM:SS PM"
        all_pos_without_time = find(IdxNoTime == 0);
        for i = 1:sum(IdxNoTime == 0)
            X{all_pos_without_time(i)} = [X{all_pos_without_time(i)},' 12:00:00 AM'];
        end
    end
    Y = datenum(X,'dd/mm/yyyy HH:MM:SS PM');
    % datestr(ENTRYTIMENUM,'dd/mm/yyyy HH:MM:SS PM'); % For checking

end
函数[Y]=timeStringToFloat(X)
%X是时间字符串的列单元格数组,例如:
%
%4215×1单元阵列
% 
%“2009年5月1日下午3:02:00”
%“2009年5月1日下午4:11:00”
%'5/1/2009'>Y
% 
%Y=
% 
%1.0e+05*
% 
%        7.337786263888889
%        7.337786743055555
%        7.337786826388889
%        7.337790256944444
%        7.337801305555556
%        7.337808958333333
%等等。
%
%
%将输入时间转换为日期数字,但我们必须确保所有输入都包含
%“HH:MM:SS PM”这不是12:00:00 AM夏普的时间戳。
%对于包含“AM”或“PM”的单元格,将[]替换为0
IdxAM=strfind(X,'AM');IdxAM(cellfun(@isempty,IdxAM))={0};
IdxPM=strfind(X,'PM');IdxPM(cellfun(@isempty,IdxPM))={0};
%没有“HH:MM:SS PM”的条目将为0
IdxNoTime=cell2mat(IdxAM)+cell2mat(IdxPM);
如果min(IdxNoTime)=0%,则至少有一个条目没有“HH:MM:SS PM”
没有时间的所有位置=查找(IdxNoTime==0);
对于i=1:sum(IdxNoTime==0)
X{all_pos_without_time(i)}=[X{all_pos_without_time(i)},'12:00:00 AM';
结束
结束
Y=datenum(X,'dd/mm/yyyy HH:mm:SS PM');
%datestr(ENTRYTIMENUM,'dd/mm/yyyy HH:mm:SS PM');%检查
结束
有人能想出更漂亮的方法吗

我在想一些类似于
X{X[end]~='m'}+='12:00:00 AM'

(此处速度不重要)。

您可以先使用将所有日期转换为所需格式
'dd/MM/yyyyy hh:MM:ss aa'
,识别未使用转换的日期,然后转换为缩短格式
'dd/MM/yyyyy'
。然后可以使用转换为数值。我使用函数帮助文本中的示例数据作为输入
X

% Input:
X = {'5/1/2009 3:02:00 PM'; ...
     '5/1/2009 4:11:00 PM'; ...
     '5/1/2009'; ...
     '6/1/2009 12:37:00 AM'; ...
     '7/1/2009 3:08:00 AM'; ...
     '7/1/2009 9:30:00 PM'};

% Conversion code:
Y = datetime(X, 'Format', 'dd/MM/yyyy hh:mm:ss aa');
index = isnat(Y);
Y(index) = datetime(X(index), 'Format', 'dd/MM/yyy');
Y = datenum(Y);
并确认正确的输出:

>> datestr(Y)

ans =

05-Jan-2009 15:02:00
05-Jan-2009 16:11:00
05-Jan-2009 00:00:00  % Notice it has assumed 12:00:00 AM
06-Jan-2009 00:37:00
07-Jan-2009 03:08:00
07-Jan-2009 21:30:00

你能澄清输入和期望的输出吗?无论如何,
datenum
似乎没有时间问题,并假设
12:00:00 AM
。运行
datenum({'5/1/2009 3:02:00 PM';'5/1/2009'})
?我认为这可能是以前版本的一种解决方法,因为在当前版本中,
datenum
似乎可以很好地处理这个问题。不幸的是,这假设了一种相当愚蠢的MM/DD/YYYY格式——我的数据是DD/MM/YYYY格式。如果我指定了
datenum(colEntryTime\u TEXT,'dd/mm/yyyy HH:mm:SS PM')
它现在对没有指定时间的条目失败。