我有一个Excel数据文件,其中包含单元格中的日期和时间。存储在单元格中的数据(也就是公式栏中的数据)是:
3/11/2016 5:27:36 PM
但显示相同的单元格
2016/03/11 17:27:37.653
我需要访问毫秒,并且出于某种原因,信息不会以相同的方式处理。 Excel无法使用它,除非我将其复制到Word并将其粘贴回Excel。如何获得MATLAB的毫秒数?我需要阅读几十个这样的文件。
我的MATLAB代码仅包含:
for i=1:5
traverse_file=sprintf('traverse_s4r%d.xlsx',i);
[num,text,both{i}]=xlsread(traverse_file);
end
这就是Excel单元格的样子:
2016/03/11 17:27:19.213 0.000004
2016/03/11 17:27:35.813 -0.00002
2016/03/11 17:27:36.000 0.000015
这是细胞中包含的内容:
3/11/2016 5:27:19 PM 0.000004
3/11/2016 5:27:36 PM -0.00002
3/11/2016 5:27:36 PM 0.000015
感谢。
答案 0 :(得分:0)
做
doc datestr
如果以下情况不起作用。有很多支持以无数格式操纵日期/时间。在杀死自己想出一个自定义解决方案之前利用这些。
time = datestr(text, 'yyyy/mm/dd hh:MM:dd.fff')
[y,m,d,h,m,s] = datevec(time);
ms = s - floor(s);
答案 1 :(得分:0)
默认情况下,xlsread
将日期/时间字段检索为根据当前系统区域设置格式化的字符串。问题是,在大多数情况下,不会显示小部分秒数,导入文件时会丢失。 the documentation of xlsread
末尾有一条说明解释:
xlsread
将格式化日期作为字符串(例如'10 / 31/96')导入,但basic
模式除外,并且在没有Excel for Windows的计算机上。
Fortunately,您可以在xlsread
中传递custom processing function以获取原始未格式化的值(仅在安装了Excel软件的Windows计算机上支持此值)。正如@RonRosenfeld在评论中解释的那样,Excel将日期时间存储为serial numbers,表示自1900年1月至1900年以来的小数天数:
Excel将日期存储为顺序序列号,以便它们可用于计算。默认情况下,1900年1月1日是序列号1,2008年1月1日是序列号39448,因为它是1900年1月1日之后的39,448天。
您可以使用.Value2
属性从COM / ActiveX获取未格式化的值。
请注意,MATLAB有自己的存储serial date numbers的约定(作为自00年1月00日以来的小数天数)。因此,一旦我们从Excel加载原始序列号,我们需要将其转换为MATLAB使用的约定。使用MATLAB中的datetime
类,转换很简单,如here所示。
现在我们已经解决了所有这些问题,下面是加载具有完整日期/时间精度的Excel文件的代码:
function t = loadMyExcelFile(fnameXLSX, sheet)
% read Excel sheet using our custom processing function to get the
% raw dates without any formatting
if nargin<2, sheet = 1; end
[~,~,~,custom] = xlsread(fnameXLSX, sheet, '', '', @CustomProcessFcn);
% convert excel dates to MATLAB datetime, also customize how
% the datetime values are displayed (with full precision)
dt = datetime(cell2mat(custom(:,1)), 'ConvertFrom','excel', ...
'Format','yyyy-MM-dd HH:mm:ss.SSSSSS');
val = cell2mat(custom(:,2));
% compute the milliseconds part alone
ms = round(rem(dt.Second, 1) * 1000);
% build and return results as a MATLAB table
t = table(dt, val, ms);
end
function [data, V2] = CustomProcessFcn(data)
V2 = data.Value2;
end
为了验证上述导入功能,我创建了一个带有随机日期和值的Excel工作表示例(如果你想跟随,可以download it here。)
(注意:我将日期的单元格格式更改为自定义yyyy-mm-dd hh:mm:ss.000
以查看毫秒部分。)
最后,你可以加载数据并操纵它,但是你想要:
>> t = loadMyExcelFile('Book1.xlsx')
t =
dt val ms
__________________________ _______ ___
2016-03-28 23:00:25.100877 0.31472 101
2016-03-29 18:58:28.578988 0.72052 579
2016-03-30 10:19:04.318113 0.3475 318
2016-03-31 10:00:26.065898 0.76088 66
2016-04-01 14:19:13.908256 0.89324 908
2016-04-02 04:29:42.858488 0.49078 858
2016-04-03 07:12:32.249770 0.26928 250
2016-04-04 16:48:25.073809 0.31616 74
2016-04-05 08:51:05.228647 0.77366 229
2016-04-06 21:38:29.768989 1.2386 769
2016-04-07 06:55:49.555229 0.89617 555
2016-04-08 01:13:40.028169 1.3668 28
2016-04-09 23:38:56.049314 1.8239 49
2016-04-10 04:13:09.258885 1.8093 259
2016-04-11 09:40:38.799400 2.1096 799
2016-04-12 03:37:27.442933 1.7515 443
2016-04-13 12:20:01.502968 1.6732 503
2016-04-14 18:15:25.406924 2.089 407
2016-04-15 14:46:10.802325 2.3812 802
2016-04-16 02:58:43.615177 2.8407 615
>> plot(t.dt, t.val)