计算一段时间的平均值,而不是一组的平均值

2024-06-26 13:57:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我无法得到一个值随时间变化的平均值。你知道吗

我有一个特定时间的传感器读数列表,我想得到传感器值的每小时平均值。你知道吗

    from datetime import datetime, timedelta
    import numpy
    import pandas

    key_id = 1234
    key_label = "Sensor1"
    t_0 = datetime(2010,1,2,12)
    data = [
        [t_0 - timedelta(seconds=120), key_id, 0],
        [t_0 + timedelta(seconds=1800), key_id, 1],
        [t_0 + timedelta(seconds=3600 + 300), key_id, 121],
        [t_0 + timedelta(seconds=3600 + 360), key_id, 1],
        [t_0 + timedelta(seconds=7200 + 1800), key_id, 2],
    ]
    df = pandas.DataFrame(list(map(lambda r: list(r), data)), columns=["TS", "KeyId", "Value"])
    df_pivot = (df
           .pivot(index="TS", columns="KeyId", values="Value")
           .ffill()
           .rename({key_id: key_label}, axis='columns')
        )

    def mymean(*args, **kwargs):
        expected_results = [numpy.NaN, 0.5, 3, 1.5]
        d0 = args[0].index[0]
        if d0 == data[0][0]:
            return expected_results[0]
        if d0 == data[1][0]:
            return expected_results[1]
        if d0 == data[2][0]:
            return expected_results[2]
        if d0 == data[4][0]:
            return expected_results[3]
        return "???"

    results = (df_pivot
           .resample('1H')
           .agg(["min", "max", "mean", "count", mymean])
          )

    display(df_pivot)
    display(results)

预期结果在mymean列中。在13:00和14:00之间有两个值。这两个值的平均值是61,但传感器仅在121处停留一分钟,因此预期的平均值应该是3(对于懒惰的读卡器:(1*59+121*1)/60)。你知道吗

KeyId   Sensor1
TS  
2010-01-02 11:58:00     0
2010-01-02 12:30:00     1
2010-01-02 13:05:00     121
2010-01-02 13:06:00     1
2010-01-02 14:30:00     2

    Sensor1
    min     max     mean    count   mymean
TS                  
2010-01-02 11:00:00     0   0   0   1   NaN
2010-01-02 12:00:00     1   1   1   1   0.5
2010-01-02 13:00:00     1   121 61  2   3.0
2010-01-02 14:00:00     2   2   2   1   1.5

我可以向上采样到采样频率,ffill和平均值,但这看起来效率很低。你知道吗


Tags: keyiddfdatareturnifresultstimedelta
1条回答
网友
1楼 · 发布于 2024-06-26 13:57:48

我是这样做的:

  1. 添加标记每个组开头的行,用ffill给它们赋值:
extra_times = pandas.date_range(t_0, periods=3, freq='1H')
pdf_reindexed = (pandas
    .concat([pdf_query, pandas.DataFrame(index=extra_times)], sort=False)
    .sort_index()
    .ffill()
    )
  1. 添加差异列span
timestamp = pdf_reindexed.index.to_series()
pdf_reindexed["span"] = (timestamp.shift(-1) - timestamp).dt.seconds
  1. value乘以span
pdf_reindexed["product"] = pdf_reindexed["span"] * pdf_reindexed["Sensor1"]
  1. 聚合和划分:
pdf_time_mean = (pdf_reindexed
                 .resample("1H")
                 .agg({"product": "sum"})
                )
pdf_time_mean["product"] = pdf_time_mean["product"] / 3600 

相关问题 更多 >