看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gr99123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
统计 运行天数(DaysOnline) 通常用于分析系统的 稳定性、可靠性 或 连续运行能力,具体意义取决于你的业务场景。
我们要分析的原始数据如下:
import pandas as pd
data = {
"Date": [
"5/29/2025", "5/31/2025", "6/1/2025", "6/2/2025",
"6/3/2025", "6/4/2025", "6/5/2025", "6/6/2025",
"6/7/2025", "6/8/2025", "6/9/2025", "6/10/2025"
],
"Status": [1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1]
}
df = pd.DataFrame(data)
df["Date"] = pd.to_datetime(df["Date"])
df
'''
Date Status
0 2025-05-29 1
1 2025-05-31 1
2 2025-06-01 1
3 2025-06-02 1
4 2025-06-03 0
5 2025-06-04 0
6 2025-06-05 0
7 2025-06-06 1
8 2025-06-07 1
9 2025-06-08 1
10 2025-06-09 1
11 2025-06-10 1
'''
一列为日期,另外一列为对应日期设备的运行状态,1 为运行状态,0 为停机状态。我们需要统计每次运行状态的最后一天及运行的天数,即结果数据为:
'''
Date DaysOnline
0 2025-06-02 4
2 2025-06-10 5
'''
核心思路是 按状态(Status
)的连续相同值分组,并统计每组最后日期和运行天数(DaysOnline
)。具体逻辑如下:
df.Status.ne(df.Status.shift(1)).cumsum()
用于识别 Status
值的变化点。每当 Status
与前一行不同时,生成一个新的分组编号(通过 cumsum()
累加实现)。例如,状态序列 [1, 1, 0, 0, 1]
会被分组为 [1, 1, 2, 2, 3]
。Date
作为该分组的结束日期,并对 Status
求和(假设 Status=1
表示运行,求和即统计连续运行天数)。query('DaysOnline > 0')
保留运行时段(排除 Status=0
的组),最后删除临时分组列(drop('group', axis=1)
)。最终代码如下:
(
df.assign(group=(df.Status.ne(df.Status.shift(1)).cumsum())) # 添加临时分组列
.groupby('group', as_index=False) # 使用列名分组
.agg(Date=('Date', 'last'),
DaysOnline=('Status', 'sum')
)
.query('DaysOnline > 0')
.drop('group', axis=1) # 可选:删除临时列
)
'''
Date DaysOnline
0 2025-06-02 4
2 2025-06-10 5
'''
这样便得到了最终的结果。
(完)
更新时间:2025-07-08 22:12:51 标签:pandas python 设备