MATLAB R2015b
我有一个表,其中包含日期字符串和各种格式的时间字符串,每行有两列:
11.01.2016 | 00:00:00 | data
10/19/16 | 05:29:00 | data
12.02.16 | 06:40 | data
我想将这两列用一种通用格式转换为一列:
31.12.2017 14:00:00
我当前的解决方案在每一行上使用循环并将列组合为字符串,检查各种格式以使用适当格式字符串的datetime,然后使用带有所需格式字符串的datestr。日期时间无法自动确定输入字符串的格式。
可以想象,对于大型桌子(大约50000行)来说,速度非常慢。
有没有更快的解决方案?
提前致谢。
答案 0 :(得分:0)
我试着对代码进行矢量化。诀窍是
此外,有一个重要的方面是以矢量化的方式填充具有'null'字符的具有较短lenth的所有单元格。没有这个,就不可能从单元转换> CHAR-阵列。这是代码。 CLC 清除所有
%% create Table T
d={'11.01.2016';
'10/19/16';
'12.02.16'};
t={'00:00:00';
'05:29:00';
'06:40'};
dat=[123;
456;
789];
T = table(d,t,dat);
%% deal with dates in Table T
% separate date column and convert to cell
dd = table2cell(T(:,1));
% equalize the lengths of all elements of cell
% by padding 'null' in end of shorter dates
nmax=max(cellfun(@numel,dd));
func = @(x) [x,zeros(1,nmax-numel(x))];
temp1 = cellfun(func,dd,'UniformOutput',false);
% convert to array for vectorized manipulation of char strings
ddd=cell2mat(temp1);
% replace the separators in 3rd and 6th location with '.' (period)
ddd(:,[3 6]) = repmat(['.' '.'], length(dd),1);
% find indexes of shorter dates
short_year_idx = find(uint16(ddd(:,nmax)) == 0);
% find the year value for those short_year cases
yy = ddd(short_year_idx,[7 8]);
% replace null chars with '20XX' string in desirted place
ddd(short_year_idx,7:nmax) = ...
[repmat('20',size(short_year_idx,1),1) yy];
% convert char array back to cell and replace in table
dddd = mat2cell(ddd,ones(1,size(d,1)),nmax);
T(:,1) = table(dddd);
%% deal with times in Table T
% separate time column and convert to cell
tt = table2cell(T(:,2));
% equalize the lengths of all elements of cell
% by padding 'null' in end of shorter times
nmax=max(cellfun(@numel,tt));
func = @(x) [x,zeros(1,nmax-numel(x))];
temp1 = cellfun(func,tt,'UniformOutput',false);
% convert to array for vectorized manipulation of char strings
ttt=cell2mat(temp1);
% find indexes of shorter times (assuming only ':00' in end is missing
short_time_idx = find(uint16(ttt(:,nmax)) == 0);% dirty hack, as null=0 in ascii
% replace null chars with ':00' string
ttt(short_time_idx,[6 7 8]) = repmat(':00',size(short_time_idx,1),1);
% convert char array back to cell and replace in table
tttt = mat2cell(ttt,ones(1,size(t,1)),nmax);
T(:,2) = table(tttt);
答案 1 :(得分:0)
如果你调用两列单元格数组Payroll
和protected Vector<GameCell> findPath(int nRow, int nCol)
{
aBoard[nRow][nCol].setVisited(true);
if(aBoard[nRow][nCol].getVal() == 'E')
{
Vector<GameCell> list = new Vector<GameCell>();
list.add(aBoard[nRow][nCol]);
return list;
}
if(canGoLeft(nRow, nCol))
{
if(!aBoard[nRow][nCol - 1].isVisited())
{
return findPath(nRow, --nCol);
}
}
if(canGoRight(nRow, nCol))
{
if(!aBoard[nRow][nCol+1].isVisited())
{
return findPath(nRow, ++nCol);
}
}
if(canGoUp(nRow, nCol))
{
if(!aBoard[nRow - 1][nCol].isVisited())
{
return findPath(--nRow, nCol);
}
}
if(canGoDown(nRow, nCol))
{
if(!aBoard[nRow + 1][nCol].isVisited())
{
return findPath(++nRow, nCol);
}
}
System.out.println("You hit a dead end.");
return null;
}
,那么这样的东西应该有用:
c1
然后你需要删除旧列并将其中的c2
放在它们的位置。在内部,c = detestr(datenum(strcat(c1,{' '},c2)), 'dd.mm.yyyy HH:MM:SS')
必须做类似于你正在做的事情,但是,我不确定这是否会更快。我怀疑这是因为(我们可以希望)标准功能得到优化。
如果您的表没有将那些表示为单元格数组,那么您可能需要执行预处理步骤以形成c
的单元格数组。