爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 6917|回复: 9

[程序设计] 【Matlab】求大神指教 关于仪器观测的时间序列数据的处理问题

[复制链接]

新浪微博达人勋

发表于 2022-3-29 14:29:00 | 显示全部楼层 |阅读模式
10金钱
本人编程小白萌新,有一周的微波辐射计观测的逐秒液水路径(LWP)时间序列,其中部分秒数有缺失,想请教大神该如何用matlab处理成逐秒样本求平均的逐小时观测数据。这个问题应该很常见,但十分困扰我,用datetime()、datevec()和datestr()反复尝试也没有成功,非常苦恼。如贵人能慷慨相助真的是万分感谢!数据请见附件。(第1至6列为时间序列,第7列为LWP观测值)

data.xlsx

13.47 MB, 下载次数: 6, 下载积分: 金钱 -5

LWP逐秒时序观测

最佳答案

查看完整内容

用时间表(timetable)吧,很简单的,循环就没必要了,写了一下你那个数据,有段时间数据是缺测没有的,这个也可以用retime()插值回来,具体你自己选择做进行做好了 % 设置表格读取形式 opts = detectImportOptions('data.xlsx'); opts.VariableNames = {'year', 'month', 'day', 'hour', 'minute', 'second', 'LWP'}; T = readtable('data.xlsx', opts); % 创建时间表中的时间行和时间表 time = datetime(T.year, T.month ...
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2022-3-29 14:29:01 | 显示全部楼层
用时间表(timetable)吧,很简单的,循环就没必要了,写了一下你那个数据,有段时间数据是缺测没有的,这个也可以用retime()插值回来,具体你自己选择做进行做好了

% 设置表格读取形式
opts = detectImportOptions('data.xlsx');
opts.VariableNames = {'year', 'month', 'day', 'hour', 'minute', 'second', 'LWP'};
T = readtable('data.xlsx', opts);
% 创建时间表中的时间行和时间表
time = datetime(T.year, T.month, T.day, T.hour, T.minute, T.second);
TT = table2timetable(table(T.LWP), 'RowTimes', time);
TT.Properties.VariableNames = {'LWP'} ;
% 使用retime()进行聚类分析
LWP_hourly = retime(TT, 'hourly', 'mean');
stackedplot(LWP_hourly)

untitled.png
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2022-3-29 14:39:19 | 显示全部楼层
问题描述:我有一周的逐秒时间序列(部分秒存在缺测),如何用matlab把它转化成逐小时时间序列,要求每个小时的值为本小时内所有秒的平均值。本人菜鸟,求大神帮助,最好有脚本让我学习,非常感谢。
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2022-3-29 15:40:24 | 显示全部楼层
可以试试用datenum把年月日时分秒的形式转化成数字的形式 然后根据你要的时间来进行平均

假如你有2020.11.1-2020.11.2 的数据  首先把所有的时间转化为数字  然后逐小时提取你要的数据 比如你先要2020.11.1. 0-1时的数据 可以将2020.11.1 0时 和 2020.11.1 1时转化为数字  然后判断所有数据大于2020.11.1 0时 并且小于2020.11.1 1时的索引 挑选出来 取个平均就行了
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2022-3-29 16:37:30 | 显示全部楼层
直接用while循环不行吗
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2022-3-29 17:00:16 | 显示全部楼层
wjy_ecnu 发表于 2022-3-29 15:40
可以试试用datenum把年月日时分秒的形式转化成数字的形式 然后根据你要的时间来进行平均

假如你有2020. ...

谢谢您的回复。如果可以的话,请问可以费心提供个脚本嘛?因为实际上我也曾这么想过,但是实际上自己编出来的程序效率特别低,运行非常慢。
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2022-3-29 17:02:50 | 显示全部楼层
气象小白01 发表于 2022-3-29 16:37
直接用while循环不行吗

谢谢您,请问可以提供一下相关的具体代码嘛?因为我自己也写过类似的循环,可惜执行非常慢。
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2022-3-29 18:32:41 | 显示全部楼层
联邦鹰 发表于 2022-3-29 17:02
谢谢您,请问可以提供一下相关的具体代码嘛?因为我自己也写过类似的循环,可惜执行非常慢。

不客气,好久不用matlab,没什么代码,如果做几层while循环嵌套的话速度应该会比较慢。
可以给你提供另外一个思路,你存成两个数组(一个时间数组,一个LWP数组),用find把每一天的location范围找出来,再根据location信息求LWP的每天平均;或者你可以用python里pd.DataFrame或pd.Series
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2022-3-29 20:49:09 | 显示全部楼层
如果是我来做的话,应该会先把数据处理成数组 data(二维数组,每列对应day,hour,min,s, LWP)
之后可以使用循化来求平均,如求小时均值(保存为data_mean 二维数组 每列对应 day,hour,LWP_mean):
ii=1;
for day_i=1:1:7
for hour_i=1:1:23
data_mean(ii,1)=day_i;
data_mean(ii,2)=hour_i;
data_mean(ii,3)=mean(data( (data(:,1)==day_i) && (data(:,2)==hour_i) ,5)) %%找出某一天,某一时刻的值求平均
ii=ii+1;
end
end
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2022-3-29 20:50:01 | 显示全部楼层
trz 发表于 2022-3-29 20:49
如果是我来做的话,应该会先把数据处理成数组 data(二维数组,每列对应day,hour,min,s, LWP)
之后可 ...

如果想提升运算速度可以使用parfor多核运算
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表