Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 不规则时间序列数据中数值变化的计数_Python_Pandas - Fatal编程技术网

Python 不规则时间序列数据中数值变化的计数

Python 不规则时间序列数据中数值变化的计数,python,pandas,Python,Pandas,我有一些时间序列数据如下所示: Timestamp Value 26/09/2013 17:00:00 1 26/09/2013 17:05:00 1 26/09/2013 17:08:41 1 26/09/2013 17:38:43 1 26/09/2013 17:49:55 0 26/09/2013 17:49:57 1 我想将其转换为一个常规时间序列(15m),并计算该值在15m时间段内的变化次数。像这样的 End

我有一些时间序列数据如下所示:

Timestamp             Value
26/09/2013 17:00:00     1
26/09/2013 17:05:00     1
26/09/2013 17:08:41     1
26/09/2013 17:38:43     1
26/09/2013 17:49:55     0
26/09/2013 17:49:57     1
我想将其转换为一个常规时间序列(15m),并计算该值在15m时间段内的变化次数。像这样的

End Timestamp         Value at End   Times Changed
26/09/2013 17:15:00       1              0
26/09/2013 17:30:00       1              0
26/09/2013 17:45:00       1              0
26/09/2013 18:00:00       1              2
我看过熊猫,但我不知道怎么做

稍微了解一下情况可能会有所帮助。这是SCADA(传感器)数据-1和0对应于设备状态-例如开关打开或关闭。SCADA系统会在当前值发生变化时报告当前值,但也会在该时间点(可能未发生变化)不定期轮询和报告当前值


我想做的是将数据转换成一种可以加载到数据库中的形式,然后我们可以开始查询哪些交换机经常改变状态。

这有点像黑客,但它可以工作:

import datetime
import pandas as pd

time_vec =     [datetime.datetime(2013,9,26,17,0,0)
               ,datetime.datetime(2013,9,26,17,5,0) 
               ,datetime.datetime(2013,9,26,17,8,41)     
               ,datetime.datetime(2013,9,26,17,38,43)
               ,datetime.datetime(2013,9,26,17,49,55)
               ,datetime.datetime(2013,9,26,17,49,57)]
df = pd.DataFrame([1,1,1,1,0,1],index = time_vec,columns=['value'])

df['count_change']=0
df.ix[df.value!=df.value.shift(1),'count_change']=1
df.ix[0,'count_change']=0

df.resample('15min',how={'value': 'last', 'count_change': 'sum'},fill_method='ffill',label='right')
编辑:

我刚刚意识到,您可能只希望在没有数据的间隔内向前填充value列,而不希望向前填充count\u change列(尽管在这个特定示例中,它不会更改任何内容)。解决办法可以是:

df.resample('15min',how={'value': 'last', 'count_change': 'sum'},label='right').fillna(value={'count_change':0}).fillna(method='ffill')

伟大的黑客-添加了一些更新,因为ix不推荐使用:df.loc[df.value!=df.value.shift(1),“count_change”]=1,df.loc['2013-09-26 17:00:00','count_change']=0