我希望评论中已经足够解释了 - 关键点是你可以使用自定义的滚动窗口函数,然后对其进行累加以将行分组为相同状态的“簇”。
freq = "1h"
df = pd.DataFrame(
[2,2,2,1,1,1,2,2,2,3,2,2,1,1],
index=pd.date_range('00:00', freq=freq, periods=14)
)
df["is_first"] = pd.rolling_apply(df, 2, lambda x: x[0] != x[1]).fillna(1)
df["value_group"] = df["is_first"].cumsum()
start = df.groupby("value_group", as_index=False).nth(0)
end = df.groupby("value_group", as_index=False).nth(-1)
start_end = pd.DataFrame(
{
"start": start.index,
"end": end.index + pd.Timedelta(freq),
"value": start[0]
}
)
start_end["duration"] = (
(start_end["end"] - start_end["start"]).apply(float) / 1e9
)
agg = start_end.groupby("value").agg(["mean", "count"])["duration"]
agg["mean"] = agg["mean"] / (60 * 60)
并且输出:
mean count
value
1 2.500000 2
2 2.666667 3
3 1.000000 1
start =
和end =
两行)。 - MichaelAnth(0)
,你的代码对我有效,我仍然在使用Pandas 0.13.1...接下来的问题是pd.Timedelta
,在我的版本中不存在。但没关系,我会从这个点开始解决,剩下的部分我自己想办法解决。非常感谢。 - MichaelA