亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

計算一段時間內的平均值,而不是組內的平均值

計算一段時間內的平均值,而不是組內的平均值

翻閱古今 2022-03-09 21:27:55
隨著時間的推移,我無法獲得平均值。我有一個特定時間的傳感器讀數列表,我想獲得傳感器值的每小時平均值。    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   Sensor1TS  2010-01-02 11:58:00     02010-01-02 12:30:00     12010-01-02 13:05:00     1212010-01-02 13:06:00     12010-01-02 14:30:00     2    Sensor1    min     max     mean    count   mymeanTS                  2010-01-02 11:00:00     0   0   0   1   NaN2010-01-02 12:00:00     1   1   1   1   0.52010-01-02 13:00:00     1   121 61  2   3.02010-01-02 14:00:00     2   2   2   1   1.5我可以對采樣頻率進行上采樣ffill并取平均值,但這看起來效率很低。
查看完整描述

1 回答

?
倚天杖

TA貢獻1828條經驗 獲得超3個贊

我是這樣做的:


添加行標記每個組的開頭,給它們值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()

    )

添加差異列span:

timestamp = pdf_reindexed.index.to_series()

pdf_reindexed["span"] = (timestamp.shift(-1) - timestamp).dt.seconds

乘以:value_span

pdf_reindexed["product"] = pdf_reindexed["span"] * pdf_reindexed["Sensor1"]

聚合和分割:

pdf_time_mean = (pdf_reindexed

                 .resample("1H")

                 .agg({"product": "sum"})

                )

pdf_time_mean["product"] = pdf_time_mean["product"] / 3600 


查看完整回答
反對 回復 2022-03-09
  • 1 回答
  • 0 關注
  • 128 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號