首页 > 解决方案 > 使用不同时区的当地时间 - Matlab 表

问题描述

我有一个记录在不同时区的时间序列数据(附上示例图)。请注意,时间信息采用 UTC。对于大型数据集,我需要将它们自动转换为当地时间 (AM/PM)。我附上了样本数据,非常感谢这方面的任何帮助。

https://www.dropbox.com/s/i2eeja8a7em87v9/Sample.csv?dl=0

在此处输入图像描述

标签: matlabdatetimetimezonelocaltime

解决方案


您可以使用TimeZoneMATLABdatetime数据类型的属性为您进行转换。唯一的麻烦是让 MATLAB “忘记”时区信息,这样您就可以拥有一个包含所需日期时间的简单数据集。我通过datenum以下方式实现了这一点:

请注意,如果您想保留时区信息,则可以通过不执行额外的转换步骤来简化此操作。

另请注意,您将用或类似的方式替换顶部的虚拟数据readtable以引入数据,但我假设源数据完全是字符单元格,即您可能需要小心readtable“巧妙地”检测日期时间列,这可能意味着您必须在循环中以不同的方式处理它或提供额外的参数readtable来防止这种自动化。

data = cell2table( { ...
    '4/02/2021 16:25', 'Pacific/Auckland'
    '4/02/2021 16:05', 'Pacific/Auckland'
    '5/02/2021 9:17',  'America/Chicago'
    '4/02/2021 22:27', 'Asia/Singapore'
    }, 'VariableNames', {'timeStrUtc','timezone'} );

data.timeUtc(:) = NaT;
data.timeLocal(:) = NaT;

for ii = 1:height(data)
    % Convert input string to UTC-timezoned datetime
    zonedDateUtc = datetime( data.timeStrUtc{ii}, ...
        'InputFormat', 'dd/MM/yyyy HH:mm', ...
        'TimeZone', 'UTC' );
    % Convert to a local datetime
    zonedDateLocal = datetime( zonedDateUtc, 'TimeZone', data.timezone{ii} );
    % Get rid of MATLAB's associated timezones by converting to datenum
    zonedDateUtc = datenum( zonedDateUtc );
    zonedDateLocal = datenum( zonedDateLocal );
    % Assign output to table, without timezones so all utc/local
    data.timeUtc(ii) = datetime( zonedDateUtc, 'ConvertFrom', 'datenum' );
    data.timeLocal(ii) = datetime( zonedDateLocal, 'ConvertFrom', 'datenum' );
end
% Format table columns
data.timeUtc.Format = 'd/M/yyyy h:mm a';
data.timeLocal.Format = 'd/M/yyyy h:mm a';

推荐阅读