BqwqHB 2023-02-28 09:03 采纳率: 100%
浏览 83
已结题

Matlab如何按条件筛选数据求日均值

有一组带有NaN值的逐半小时平均数据,图是数据大概的情况。现在想对其求日均值,同时如果某日的NaN值数量大于40%,那么该日的平均值就视为无效值,想问下大家如何用matalb实现?

img

  • 写回答

6条回答 默认 最新

  • 这我哪会啊 2023-02-28 09:23
    关注

    在 Matlab 中,可以使用以下步骤实现对带有 NaN 值的逐半小时平均数据的日均值求解和无效值的判断:
    1、将数据按照日期划分成多个子数组,每个子数组包含一天的数据。可以使用 datetime 函数将时间字符串转换成 Matlab 的日期格式,并利用 unique 函数得到数据中的所有日期。
    2、对于每个子数组,计算其中非 NaN 值的平均值。可以使用 nanmean 函数计算平均值,该函数会忽略 NaN 值
    3、对于每个子数组,计算其中 NaN 值的比例。可以使用 isnan 函数判断哪些元素为 NaN,然后使用 sum 函数计算 NaN 值的数量。
    4、对于每个子数组,判断其中 NaN 值的比例是否大于 40%。如果是,则该子数组的平均值为无效值
    下面是具体的代码实现

    % 带有 NaN 值的逐半小时平均数据
    data = [1 2 NaN NaN 5 NaN NaN 8 9 NaN 10 11];
    
    % 时间戳,假设每个时间戳间隔为半小时
    timestamps = datetime('now') - hours(length(data)/2:-0.5:0.5);
    
    % 按照日期划分数据
    dates = dateshift(timestamps, 'start', 'day');
    unique_dates = unique(dates);
    daily_data = cell(length(unique_dates), 1);
    for i = 1:length(unique_dates)
        daily_data{i} = data(dates == unique_dates(i));
    end
    
    % 计算日均值
    daily_means = nan(length(unique_dates), 1);
    for i = 1:length(unique_dates)
        daily_means(i) = nanmean(daily_data{i});
    end
    
    % 判断无效值
    threshold = 0.4;
    is_invalid = cellfun(@(x) sum(isnan(x))/length(x) > threshold, daily_data);
    daily_means(is_invalid) = NaN;
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 3月8日
  • 已采纳回答 2月28日
  • 创建了问题 2月28日

悬赏问题

  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度