熊猫基于时间的平均值

时间:2021-03-10 09:52:04

标签: python pandas influxdb

我已经将不同的数据从 homeassistant 导入到 influx db 现在我将它放在一个 Pandas 数据框中,我想获得 mean() 但它应该基于索引中的时间。

我选择了一个小的 df 进行测试,它看起来像这样:

                                   value
time                                   
2021-03-09 07:25:41.989791+00:00    0.0
2021-03-09 07:26:45.165453+00:00    0.0
2021-03-09 16:56:04.806150+00:00    1.0
2021-03-09 18:10:57.762609+00:00    0.0
2021-03-09 19:45:55.182860+00:00    1.0
2021-03-09 19:49:27.519186+00:00    0.0

例如,这只是我家里的一盏灯。我想随着时间的推移有平均值。所以我可以看到它打开的时间有多少%。当它说 1 时,它应该是 1 直到下一个数据点。在这个 df 中,平均值应该非常低,因为大部分时间灯都是关闭的。它仅在 16:56:04 到 18:10:57 和 19:45:55 到 19:49:27 之间打开。所以它打开大约:1小时19分钟,总记录时间12小时23分钟。所以灯亮了大约 10% 的记录时间。

还有两个问题:

  1. 我的传感器的值不同于 1 和 0(例如温度)

    2.日子会变。

我真的不知道如何开始有人有想法吗?

1 个答案:

答案 0 :(得分:0)

您可以计算每个值的持续时间(time_next - time,然后转换为秒),然后取每天的加权平均值:

# calculate durations
df['date'] = df['time'].dt.date
df['time_next'] = df['time'].shift(-1).ffill()
df['duration_s'] = (df['time_next'] - df['time']).dt.seconds

# calculate weighted average by date
df.groupby('date').apply(
    lambda z: np.average(z['value'], weights=z['duration_s']))

输出:

date
2021-03-09    0.105416
dtype: float64

附言值可以是任何数字,当然不仅仅是二进制


更新:

为了正确处理多天系列,我们可以更改数据框,为每天结束(或第二天开始)添加记录,并使用当天看到的最后一个值。

例如,在原始帖子的示例数据中,这将是 0 处的 2021-03-10 00:00:00 值。这样,当天最后一条记录的持续时间将显示到当天结束的剩余秒数,从而使我们的加权平均值计算正确。

这里是如何在代码中完成的(这里我假设 time 是原始数据帧的索引):

# add day-end values
z = df.append(
    df.resample('1d', label='right').last().ffill()
).sort_index()

# calculate durations
z['duration_s'] = -z.index.to_series().diff(-1).dt.total_seconds()

# calculate weighted average by date
z.groupby(z.index.date).apply(
    lambda z: np.average(z['value'], weights=z['duration_s'])).dropna()