【问题标题】:MatLab cells date format conversionMatLab 单元格日期格式转换
【发布时间】:2013-08-10 10:24:34
【问题描述】:

我在 MatLab 中有很多约会(超过 200 万)。所有这些日期都在'yyyymmdd' 格式的单元格数组中,我想将它们转换为'yyyy-mm-dd' 格式并将此结果放入一个单元格数组中(而不是在字符矩阵中)。

我知道我可以使用

temp = datestr(datenum(datesArray,'yyyymmdd'),'yyyy-mm-dd'), 

然后使用

mat2cell(temp, ones(1,n),10), 

其中ndatesArray 的行数(在本例中约为 2 百万),以便得到我的结果,但这种方法非常慢。

所以,我想知道一种不同的方法。

问候。

【问题讨论】:

  • 我正在尝试想出一个非常酷的解决方案!
  • 为什么你仍然有单元字符串格式的日期而不是序列日期,这就是问题所在!?
  • 因为这些日期是从外部系统的txt文件中导入的。

标签: matlab date format cell


【解决方案1】:

所以这是我的解决方案,我认为这非常好!

dates = {'20120101', '20120102', '20120103'}

你可以使用这个转换:

cellfun(@(x)regexprep(num2str(x), '(?<=\d{4})\d{2}', '-$0'),dates,'Uniform',false)

答案类似于radarhead,但它使用regexprep函数代替。

【讨论】:

  • 感谢您的帮助。事实上,我尝试 regexprep(date, '(?
【解决方案2】:

将您的日期转换为连续日期并保留它们!但是,这里有一个解决方案:

% Create dummy dates (takes 10 seconds on my pc)
tic;d = cellstr(datestr(now-2e5+1:now,'yyyymmdd'));toc

% Convert to char, then concatenate with '-' and back to `cellstr()` (1 sec):
c    = char(d);
dash = repmat('-',2e5,1);
c    = cellstr([c(:,1:4) dash c(:,5:6) dash c(:,7:8)]);

【讨论】:

  • 谢谢,但在这种情况下,初始日期不在单元格数组中。
  • 哪种情况? d 是字符串日期的元胞数组。
【解决方案3】:

您可以通过使用cellfun 来避免 for 循环,假设您的日期单元格数组是

dates = {'20120101', '20120102', '20120103'}

然后您可以将它们转换为您的格式

cellfun(@(x)[x(1:4),'-',x(5:6),'-',x(7:8)], dates, 'Uniform', false)

希望对您有所帮助。

【讨论】:

  • 感谢您的帮助。此解决方案运行良好,速度与预期一样。
  • cellfun() 是一个隐藏循环,99% 的情况下比显式循环慢。
【解决方案4】:

如果您的日期格式始终为“yyyymmdd”并且它位于名为datesArray 的线性元胞数组中,您可以通过访问datesArray 中的字符串并通过插入连字符并连接字符串来转换它们来实现。

for i=1:length(datesArray)
newDatesArray{i} = [datesArray{i}(1:4), '-', datesArray{i}(5:6), '-', datesArray{i}(7:8)];
end

【讨论】:

  • 我会尝试这样做,但通常 MatLab 在我们使用循环时效率不高。所以,我在想一些避免循环的方法。
  • 天哪,我犯了很多错误。现在应该修好了。教我不要先尝试(我在想什么?)
  • 如果你想要速度,我实际上可能只是建议切换到更快的语言。对于大型数组,C、UNIX 甚至 Python 可能会胜过 MATLAB。当我再次切换操作系统时,我可能会找到一个不错的 UNIX 答案(并在发布之前检查它:P),但您也可以尝试使用更多语言标签发布另一个问题。
  • 对不起@thefourtheye,但问题与其他编程语言无关。
猜你喜欢
  • 1970-01-01
  • 2020-11-24
  • 2017-12-23
  • 1970-01-01
相关资源
最近更新 更多