如何在Octave中将CSV含空格的timestamp转换为时间序列数据?
在Octave中处理CSV中的意大利语时间戳并转换为时间序列
核心问题说明
你用strftime没成功是因为搞反了函数用途:strftime是将时间格式转为字符串,而你需要的是将字符串时间解析为可用于时间序列的格式,应该用strptime。另外你的时间戳用的是意大利语月份缩写(比如gen代表一月),需要先处理才能被Octave识别。
分步解决方案
1. 导入CSV并提取时间戳列
假设你已经用csv2cell导入了数据,先提取表头外的时间戳字符串:
csv_data = csv2cell("你的文件名.csv"); % 跳过第一行表头,提取所有时间戳字符串 timestamp_strings = csv_data(2:end, 1);
2. 替换意大利语月份缩写为英文
Octave的strptime默认依赖系统区域设置,直接识别不了意大利语月份,所以先替换为英文缩写:
% 建立意大利语-英文月份映射 month_map = containers.Map(... {"gen", "feb", "mar", "apr", "mag", "giu", "lug", "ago", "set", "ott", "nov", "dic"}, ... {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}); % 批量替换所有时间字符串中的月份 timestamp_strings_en = timestamp_strings; for it_month = keys(month_map) timestamp_strings_en = strrep(timestamp_strings_en, it_month, month_map(it_month)); end
3. 解析时间字符串为时间结构体
用strptime按时间格式解析:
% 格式说明:%d=日,%b=月份缩写,%Y=年,%H:%M:%S=时分秒,%Z=时区 time_structs = strptime(timestamp_strings_en, "%d %b %Y %H:%M:%S %Z");
4. 转换为数值时间(用于时间序列分析)
将时间结构体转为Octave的数值日期格式(datenum),方便后续分析或绘图:
% 转为datenum格式(自0000年1月1日的天数) numeric_time = datenum(time_structs); % 可选:转为Unix时间戳(自1970-01-01 UTC的秒数) unix_time = (numeric_time - datenum(1970, 1, 1)) * 86400;
5. 同步处理其他数据列
你的CSV中数值用逗号做小数点,需要替换为点后转成数值:
humidity = str2double(strrep(csv_data(2:end, 2), ",", ".")); temperature = str2double(strrep(csv_data(2:end, 3), ",", ".")); pressure = str2double(strrep(csv_data(2:end, 4), ",", "."));
示例:绘制时间序列图
用处理后的时间和数据绘图,自动格式化时间轴:
plot(numeric_time, temperature); datetick("x", "HH:MM:SS"); % 设置x轴显示时分秒 xlabel("时间"); ylabel("温度 (°C)"); title("LOC20 温度时间序列");
内容的提问来源于stack exchange,提问作者Alberto Scrofani
相关产品推荐
相关产品推荐

