如何在python timeseries数据帧中查找连续事件的发生?
我得到了一个带有日期和值列的气象观测时间序列:如何在python timeseries数据帧中查找连续事件的发生?,python,pandas,Python,Pandas,我得到了一个带有日期和值列的气象观测时间序列: df = pd.DataFrame({'date':['11/10/2017 0:00','11/10/2017 03:00','11/10/2017 06:00','11/10/2017 09:00','11/10/2017 12:00', '11/11/2017 0:00','11/11/2017 03:00','11/11/2017 06:00','11/11/2017 09:00','1
df = pd.DataFrame({'date':['11/10/2017 0:00','11/10/2017 03:00','11/10/2017 06:00','11/10/2017 09:00','11/10/2017 12:00',
'11/11/2017 0:00','11/11/2017 03:00','11/11/2017 06:00','11/11/2017 09:00','11/11/2017 12:00',
'11/12/2017 00:00','11/12/2017 03:00','11/12/2017 06:00','11/12/2017 09:00','11/12/2017 12:00'],
'value':[850,np.nan,np.nan,np.nan,np.nan,500,650,780,np.nan,800,350,690,780,np.nan,np.nan],
'consecutive_hour': [ 3,0,0,0,0,3,6,9,0,3,3,6,9,0,0]})
在这个数据帧中,我需要第三列连续的\u小时,这样,如果特定时间戳中的值小于1000,我们将在“连续小时”中给出相应的值“3:00”小时,并找到类似于上述6:00 9:00的连续事件
最后,我想总结一下统计连续小时数和天数的表,这样总结表如下所示:
df_summary = pd.DataFrame({'consecutive_hours':[3,6,9,12],
'number_of_day':[2,0,2,0]})
我尝试了几种在线解决方案和方法,如shift()、diff()等,如中所述:
还有更多的,花了几天,但还没有运气
我将非常感谢在这个问题上的帮助。
谢谢 输入数据:
>>> df
date value
0 2017-11-10 00:00:00 850.0
1 2017-11-10 03:00:00 NaN
2 2017-11-10 06:00:00 NaN
3 2017-11-10 09:00:00 NaN
4 2017-11-10 12:00:00 NaN
5 2017-11-11 00:00:00 500.0
6 2017-11-11 03:00:00 650.0
7 2017-11-11 06:00:00 780.0
8 2017-11-11 09:00:00 NaN
9 2017-11-11 12:00:00 800.0
10 2017-11-12 00:00:00 350.0
11 2017-11-12 03:00:00 690.0
12 2017-11-12 06:00:00 780.0
13 2017-11-12 09:00:00 NaN
14 2017-11-12 12:00:00 NaN
cumcount\u reset
功能根据以下内容进行调整:汇总表
df_summary = df.loc[df.groupby(pd.Grouper(key="date", freq="D"))["consecutive_hour"] \
.apply(lambda h: (h - h.shift(-1).fillna(0)) > 0),
"consecutive_hour"] \
.value_counts().reindex([3, 6, 9, 12], fill_value=0) \
.rename("number_of_day") \
.rename_axis("consecutive_hour") \
.reset_index()
连续\u小时
列是否为预期结果?如果是,请解释为什么2017-11-11 06:00:00
和12 2017-11-12 06:00:00
是9,而2017-11-10 06:00:00
是0。是的,连续小时列是预期结果。是的,连续小时列是预期结果。2017-11-11 06:00:00是9,因为如果您查看“值”列,您会看到在时间戳2017-11-11 06:00:00之前有三行连续出现的值:500650和780。2017-11-12 06:00:00也有同样的逻辑。2017-11-10 06:00:00具有0个连续小时值,因为此时间戳和2017-11-10 03:00:00上存在Nan值。您确定df_摘要
?我发现{3:3,6:2,9:2,12:0}
是的,这就像:连续的_小时==3(单独)发生在2017-11-10 00:00:00和2017:11:11 12:00:00不同的一天,使得连续的3小时数等于2。2017-11-11和2017-11-12的最高连续值为9,同样地,9等于2。一天中没有一个最高**连续小时**为6或12;所以它们等于0。@Corrarien,我再感谢你不过了。你真的救了我一天。你能帮我回答问题的第二部分吗?我也需要找到汇总表:df_summary=pd.DataFrame({'continuous_hours':[3,6,9,12],'number_of_day':[2,0,2,0]})如果答案对你有帮助,但你还没有,请不要忘了向上投票。再次感谢@corrarien。效果很好。帮了大忙。非常感谢。我已经投票了。~@corrarien~我发布了新问题:,我也很高兴收到你的意见。谢谢
>>> df
date value consecutive_hour
0 2017-11-10 00:00:00 850.0 3
1 2017-11-10 03:00:00 NaN 0
2 2017-11-10 06:00:00 NaN 0
3 2017-11-10 09:00:00 NaN 0
4 2017-11-10 12:00:00 NaN 0
5 2017-11-11 00:00:00 500.0 3
6 2017-11-11 03:00:00 650.0 6
7 2017-11-11 06:00:00 780.0 9
8 2017-11-11 09:00:00 NaN 0
9 2017-11-11 12:00:00 800.0 3
10 2017-11-12 00:00:00 350.0 3
11 2017-11-12 03:00:00 690.0 6
12 2017-11-12 06:00:00 780.0 9
13 2017-11-12 09:00:00 NaN 0
14 2017-11-12 12:00:00 NaN 0
df_summary = df.loc[df.groupby(pd.Grouper(key="date", freq="D"))["consecutive_hour"] \
.apply(lambda h: (h - h.shift(-1).fillna(0)) > 0),
"consecutive_hour"] \
.value_counts().reindex([3, 6, 9, 12], fill_value=0) \
.rename("number_of_day") \
.rename_axis("consecutive_hour") \
.reset_index()
>>> df_summary
consecutive_hour number_of_day
0 3 2
1 6 0
2 9 2
3 12 0