You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Matlab中使用readtable按Excel显示格式导入日期时间数据

如何用readtable按Excel显示格式导入日期时间数据(无多余时间组件)

问题背景

我有多个包含日期时间变量的Excel文件/工作表,部分数据无时间组件,导致单元格格式分为「Date」(dd/MM/yyyy)和「Custom」(dd/MM/yyyy HH:mm)两类。

尝试用readtable结合setvaropts以字符类型导入,结果不符合预期:

opts = detectImportOptions(xls_path);
opts=setvaropts(opts,{'my_datetime_var','excel_format','excel_display'},'Type','char');
data_as_char=readtable(xls_path,opts)

输出结果:

data_as_char =

  2×3 table

          my_datetime_var                  excel_format               excel_display    
    ___________________________    ____________________________    ____________________

    {'2023-03-08 00:00:00.000'}    {'Date'                    }    {'08/03/2023'      }
    {'2023-03-09 12:01:00.000'}    {'Custom: dd/mm/jjjj uu:mm'}    {'09/03/2023 12:01'}

核心问题:my_datetime_var显示格式与excel_display不符,且无时间组件的数据被自动添加00:00:00.000时间部分。

旧函数xlsread能保留显示格式,但已被官方弃用:

[~,txt] = xlsread(xls_path)

输出:

txt =

  3×3 cell array

    {'my_datetime_var'    }    {'excel_format'            }    {'excel_display'     }
    {'08/03/2023'         }    {'Date'                    }    {'"08/03/2023"'      }
    {'09/03/2023 12:01:00'}    {'Custom: dd/mm/jjjj uu:mm'}    {'"09/03/2023 12:01"'}

解决方案

方法1:转CSV后读取(最简单直接)

  • 先将Excel文件另存为CSV格式(保存时确保选择保留单元格显示文本)
  • 用readtable读取CSV文件,指定变量类型为字符:
opts = detectImportOptions('your_converted_file.csv');
opts = setvaropts(opts, 'my_datetime_var', 'Type', 'char');
data = readtable('your_converted_file.csv', opts);

此方法读取的my_datetime_var会完全保留Excel中的原始显示格式,无多余时间组件。

方法2:通过Excel COM接口读取显示文本

直接调用Excel COM对象获取单元格的显示文本,再转换为table:

% 启动Excel后台服务
excel = actxserver('Excel.Application');
excel.Visible = false;
workbook = excel.Workbooks.Open(fullfile(pwd, xls_path));
sheet = workbook.Sheets.Item(1); % 目标工作表索引

% 获取所有单元格的显示文本
range = sheet.UsedRange;
cell_text = range.Value;

% 关闭资源
workbook.Close(false);
excel.Quit;
excel.delete;

% 转换为table
data = cell2table(cell_text(2:end,:), 'VariableNames', cell_text(1,:));

该方法直接读取Excel单元格的原始显示内容,完全匹配需求,且不依赖弃用函数。

方法3:导入datetime后按需格式化

如果需要保留datetime类型做后续计算,可导入后根据excel_format列的信息转换为对应格式的字符:

opts = detectImportOptions(xls_path);
opts = setvaropts(opts, 'my_datetime_var', 'Type', 'datetime');
data = readtable(xls_path, opts);

% 根据原始格式转换显示文本
data.formatted_datetime = arrayfun(@(dt, fmt) ...
    contains(fmt, 'HH:mm') ? char(datetime(dt, 'Format', 'dd/MM/yyyy HH:mm')) : char(datetime(dt, 'Format', 'dd/MM/yyyy')), ...
    data.my_datetime_var, data.excel_format, 'UniformOutput', false);

此方法兼顾数据计算需求和显示格式准确性。

内容的提问来源于stack exchange,提问作者mrroy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 16:32:37