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'但是我看不到用Matlab提供的语法实现这一点的任何方法
(此处速度不重要)。您可以先使用将所有日期转换为所需格式'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')
它现在对没有指定时间的条目失败。