繁体   English   中英

Pandas:在其他列的条件更改后,列在时间跨度内的平均值

[英]Pandas: Mean of columns over timespan after a conditon change in other column

(这与Pandas 相关:第二列中条件变化之间的列的平均值

假设我有以下 dataframe:

import pandas as pd
import numpy as np

data = np.random.randint(1, 10, size=(10,2))

df = pd.DataFrame(data, columns=['x1', 'x2'])
df['switch'] = [1,1,0,0,1,1,0,0,1,1]
index_ = pd.date_range('2022-01-17 13:00:00', periods=10, freq='5s')
df.index = index_.rename('Time')

导致:

                    x1  x2  switch
Time            
2022-01-17 13:00:00 2   6   1
2022-01-17 13:00:05 9   8   1
2022-01-17 13:00:10 4   9   0
2022-01-17 13:00:15 5   6   0
2022-01-17 13:00:20 4   9   1
2022-01-17 13:00:25 6   7   1
2022-01-17 13:00:30 4   6   0
2022-01-17 13:00:35 2   3   0
2022-01-17 13:00:40 4   9   1
2022-01-17 13:00:45 5   2   1

我正在寻找一种方法,根据结束时间,为开关值为 1 的每个块获取 x1 和 x2 的方法。开关值从 1 变为 0 后,x1 和 x2 的方法应该是计算前 5 秒,并将这些值最好放在新的 dataframe 中,返回如下内容:

开始时间:2022-01-17 13:00:00

结束:2022-01-17 13:00:05

x1 均值:5.5

x2 均值:7

如果我正确理解你的问题,你可以简单地使用 function 如下所示:

def getTmean(fTime, lTime, df):
  if "Time" not in df.columns:
    df.reset_index(inplace=True)
  if "Time" not in df.columns:
    raise ValueError("No time index in dataframe")
  
  df["Time"] = pd.to_datetime(df["Time"])
  dfSelected = df[(df["Time"] >= fTime) & (df["Time"] <= lTime) & (df["switch"] == 1)]
  return (dfSelected["x1"].mean(), dfSelected["x2"].mean())
getTmean("2022-01-17 13:00:00", "2022-01-17 13:00:05", df)

在您的情况下,它会导致:

(5.5, 7.0)

解释

function getTmean()得到三个 arguments:

  • fTime ,这是字符串中的开始时间
  • lTime ,这是字符串中的结束时间
  • df ,即 dataframe

请注意,dataframe 至少应该有一个名为Time的列,其中包含日期值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM