【问题标题】:Converting decimals to [h]:mm:ss将小数转换为 [h]:mm:ss
【发布时间】:2018-10-17 08:51:41
【问题描述】:

我正在将数据从 Excel 导入 MATLAB。我在 Excel 中的数据是 [h]:mm:ss 格式,但是在导入到 MATLAB 后数据变成了十进制数。

有没有办法在 MATLAB 中将此数据转换回[h]:mm:ss 格式?

一些例子:

21:45:05 equals 0.906307870370370
21:14:31 equals 0.885081018518519
213:17:56 equals 8.88745370370370

我理解转换是 24 小时的倍数,以秒、分钟或小时为单位 - 这意味着 12:00:00 = 0.5。但我不明白如何将数据转换回来,即 0.75 变为 18:00:00 等?

我已尝试New_Nun(i,j) = datestr(nun(i,j),'HH:MM:SS'); 进行此转换,但出现此错误 -

由于左侧的索引与右侧的大小不兼容,无法执行分配。

这是因为我的nun 变量包含NaN 吗?

【问题讨论】:

  • 我认为你的命令的 RHS 运行,但它给出了一个字符串,我会说它不适合 New_Nun(i,j)。 RHS 是否运行,如果运行,结果如何?
  • @Adriaan RHS 运行 - 直到我到达 NaN 时它停止 - 所以你是说 New_Nun 的定义需要更改为 Cell 变量?
  • 啊,如果它运行良好直到遇到NaN 值,只需检查并丢弃那些,例如nun(isnan(nun))=[]
  • 请注意,您使用了错误的日期时间格式字符串...HH:MM:SS24hr hours : 2 digit month : 2 digit factional second!您可能想要更多类似HH:mm:ss 的东西,请阅读文档!另请注意,Matlab 的日期数字(十进制值)定义为“从 0000 年 1 月 0 日开始的天数”,我不确定您的 Excel 导入数据是否与此相对应。
  • @Adriaan 通过isnan(nun(i,j)) == 0 和一个 if 循环完成了这项工作——尽管你的解决方案更简洁,谢谢!

标签: excel matlab datetime datetime-format


【解决方案1】:

注意datestr 输出一个字符串,而New_Nun(i,j)=...assignment 需要一个值。

datestr(nun(i,j),'HH:MM:SS') 输出一个 [8 x 1] 字符数组,它不适合New_Nun(i,j)。顺便说一下,'HH:MM:SS' 确实是小时、分钟和秒的正确参数。

您可能更愿意为 New_Nun 使用一个单元格,它可以包含任何类型的数据,包括任意长度的字符串:

%Initialize random values with a NaN
nun=rand([5 5]);
nun(2,5)=NaN;

New_Nun = cell(size(nun));  %Initialize the cell array
not_a_nan = ~isnan(nun);    %Selection valid values
New_Nun(not_a_nan) = cellstr(datestr(nun(not_a_nan),'HH:MM:SS')); %Fill the cell array

disp(New_Nun)    
'13:47:28'    '23:37:19'    '06:00:28'    '13:24:09'    '12:38:05'
'00:55:58'    '08:34:58'    '04:25:44'    '11:14:46'            []
'13:17:25'    '10:34:02'    '11:17:16'    '04:42:18'    '05:51:32'
'20:40:44'    '18:30:16'    '04:29:22'    '17:43:03'    '22:05:24'
'16:36:35'    '10:17:18'    '22:45:41'    '16:04:17'    '07:06:39'

NaN 值已转换为空单元格。它可以替换为任何默认值,例如New_Nun(~not_a_nan)={'00:00:00'};

此代码不处理超过 24 小时的日期,如 datestr。比,小时需要分开处理。

%Initialize random values with a NaN and one value larger than 24h
nun=rand([5 5]);
nun(2,5)=NaN;
nun(3,4)=nun(3,4)+10;   % One value above 24h

New_Nun = cell(size(nun));  %Initialize the cell array
not_a_nan = ~isnan(nun);    %Selection valid values

mmss = cellstr(datestr(nun(not_a_nan),'MM:SS')); %Write only MM:SS
hh   = floor(nun(not_a_nan(:))*24); %Get hours, and make it a column vector

%Now, add the hours
hours_not_zero = hh~=0; % Optional: used to display mm:ss if hh=0
mmss(hours_not_zero) = cellfun(@(h,m) sprintf('%02d:%s',h,m),num2cell(hh(hours_not_zero)),mmss(hours_not_zero),'uniformoutput',false);


New_Nun(not_a_nan) = mmss;
disp(New_Nun)
'02:53:42'    '08:38:56'    '12:07:03'    '15:28:54'    '12:49:18'
'16:21:15'    '03:44:23'    '01:22:31'    '20:43'               []
'02:36:04'    '11:08:51'    '19:51:35'    '244:45:48'   '33:55'   
'16:14:08'    '08:04:01'    '12:27:22'    '08:17:48'    '06:16:15'
'10:41:08'    '03:16:19'    '04:47:15'    '04:33:37'    '20:36:42'

这一次,值 35:34:11 正确表示。不显示重要的时间,例如“20:43”为“00:20:43”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-19
    • 2013-12-26
    • 2012-01-27
    • 1970-01-01
    • 2021-09-11
    • 2012-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多