如何访问Excel单元格中的所有数据?我需要导入MATLAB

时间:2016-03-27 18:34:37

标签: excel matlab datetime import-from-excel

我有一个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

感谢。

2 个答案:

答案 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。)

excel_sheet

(注意:我将日期的单元格格式更改为自定义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)

datetime_plot