Python 如何在时间序列行上迭代并获得特定值的时间戳?

Python 如何在时间序列行上迭代并获得特定值的时间戳?,python,pandas,Python,Pandas,这里的值从0增加到1,在短时间内保持1.0,然后再次开始减小到0。 我有一个巨大的数据框架,其中的值每天都以这种模式波动 我的问题是,我如何找到值从0增加到某个值的时间戳或时间,并说1.0(有时可能大于1,但总是小于1.5)是峰值。 然后是1.0的持续时间,再减少到0需要多长时间。我需要找出这种行为的平均值 输出应该是时间戳,时间戳val刚大于0,从时间戳到val达到峰值,再到时间戳变为0。从0到再次0的总时间。 Val是发动机的性能 import numpy as np # taking s

这里的值从0增加到1,在短时间内保持1.0,然后再次开始减小到0。 我有一个巨大的数据框架,其中的值每天都以这种模式波动

我的问题是,我如何找到值从0增加到某个值的时间戳或时间,并说1.0(有时可能大于1,但总是小于1.5)是峰值。 然后是1.0的持续时间,再减少到0需要多长时间。我需要找出这种行为的平均值

输出应该是时间戳,时间戳val刚大于0,从时间戳到val达到峰值,再到时间戳变为0。从0到再次0的总时间。
Val是发动机的性能

import numpy as np

# taking some random values
rng = pd.date_range('2018-01-15', '2018-01-17', freq ='1H', closed ='left')

Val = [0,0,0,0,0,0,0,0.2,0.4,0.7,0.8,1,1,1,1,0.6,0.5,0.2,0,0,0,
       0,0,0,0,0,0,0,0,0,0,0.1,0.3,0.6,0.9,1,1,1,1,0.6,0.5,0.2,0,0,0,0,0,0]

df = pd.DataFrame({ 'Date': rng, 'Val': Val})
df
    Date                    Val
0   2018-01-15 00:00:00     0.0
1   2018-01-15 01:00:00     0.0
2   2018-01-15 02:00:00     0.0
3   2018-01-15 03:00:00     0.0
4   2018-01-15 04:00:00     0.0
5   2018-01-15 05:00:00     0.0
6   2018-01-15 06:00:00     0.0
7   2018-01-15 07:00:00     0.2
8   2018-01-15 08:00:00     0.4
9   2018-01-15 09:00:00     0.7
10  2018-01-15 10:00:00     0.8
11  2018-01-15 11:00:00     1.0
12  2018-01-15 12:00:00     1.0
13  2018-01-15 13:00:00     1.0
14  2018-01-15 14:00:00     1.0
15  2018-01-15 15:00:00     0.6
16  2018-01-15 16:00:00     0.5
17  2018-01-15 17:00:00     0.2
18  2018-01-15 18:00:00     0.0
19  2018-01-15 19:00:00     0.0
20  2018-01-15 20:00:00     0.0
21  2018-01-15 21:00:00     0.0
22  2018-01-15 22:00:00     0.0
23  2018-01-15 23:00:00     0.0
24  2018-01-16 00:00:00     0.0
25  2018-01-16 01:00:00     0.0
26  2018-01-16 02:00:00     0.0
27  2018-01-16 03:00:00     0.0
28  2018-01-16 04:00:00     0.0
29  2018-01-16 05:00:00     0.0
30  2018-01-16 06:00:00     0.0
31  2018-01-16 07:00:00     0.1
32  2018-01-16 08:00:00     0.3
33  2018-01-16 09:00:00     0.6
34  2018-01-16 10:00:00     0.9
35  2018-01-16 11:00:00     1.0
36  2018-01-16 12:00:00     1.0
37  2018-01-16 13:00:00     1.0
38  2018-01-16 14:00:00     1.0
39  2018-01-16 15:00:00     0.6
40  2018-01-16 16:00:00     0.5
41  2018-01-16 17:00:00     0.2
42  2018-01-16 18:00:00     0.0
43  2018-01-16 19:00:00     0.0
44  2018-01-16 20:00:00     0.0
45  2018-01-16 21:00:00     0.0
46  2018-01-16 22:00:00     0.0
47  2018-01-16 23:00:00     0.0




 ### output should look like this 
```result = pd.DataFrame({ 'motor_s': '2018-01-15 07:00:00' , 's_val': 0.2 ,
                       'motor_max_s': '2018-01-15 11:00:00' , 'max_s_val' : 1.0,
                     'motor_max_e' :'2018-01-15 15:00:00', 'max_e_val' : 0.6,
                      'motor_e' :'2018-01-15 18:00:00', 'e_val' :0 }, index=[0])```


motor_s : start time when the val became greater than 0
s_val : sarting val
motor_max_s : timestamp when the motor running at full speed 
max_s_val : maximum start value 
motor_max_e : time stamp when the val became lesser than max_s_val which is 1.0
max_e_val : maximum end value
motor_e : timestamp when motor stopped running
e_val : that end value which is always be zero

我使用了,我假设输入已被读取为字符串

导入日期时间
将numpy作为np导入
日期:2018-01-15 00:00:00 0.0
2018-01-15 01:00:00  0.0
2018-01-15 01:20:00  0.5
2018-01-15 01:40:00  0.8
2018-01-15 02:00:00  1.0
2018-01-15 02:20:00  1.0
2018-01-15 02:40:00  1.0
2018-01-15 03:20:00  0.6
2018-01-15 03:40:00  0.4
2018-01-15 04:00:00  0.0'''
val_was_zero=错误
prev_val=-1.0
prev2_val=-1.0
上一个日期=无
VAL=[]
日期=[]
对于l in date\u vals\u str.splitlines():
印刷品(l)
日期和时间,val=l.split(“”)
val=浮动(val)
date\u time\u obj=datetime.datetime.strtime(date\u time,“%Y-%m-%d%H:%m:%S”)
dates.append(日期\时间\对象)
val.append(val)
VAL_arr=np.数组(VAL)
ε=0.001
zero_idx=np.其中(VAL_arepsilon))
对于我来说,开始:
print({}处的值刚大于0。格式(日期[i]))
max=np.r\u[False,vals\u-arr[1:]>vals\u-arr[:-1]]&np.r\u[vals\u-arr[:-1]>=vals\u-arr[1:],True]
max_idx=np.其中(max==True)
对于np.nditer中的i(max_idx):
打印(VAL[i])
打印('Peak val:({})位于{}'。格式(val[i],日期[i]))
#打印(最大idx)
#打印(最大值)
#打印(开始)
#打印(差异)
#打印(零位idx)

尽管这个问题有些不完整,但这里有一种方法可以提取具有多个周期的完整数据帧所需的指标:

将numpy导入为np
作为pd进口熊猫
#获取更多周期(df_0是示例数据)
df=pd.concat([df_0表示范围(5)])
df['Date']=pd.日期范围('2018-01-15 00:00:00',
“2018-01-15 16:20:00”,频率为20分钟)
#识别模式特征并添加到dataframe
特性={'ramp_start':(df.Val>0)和(df.Val.shift(1)==0),
“最大启动”:(df.Val==1)和(df.Val.shift(1)<1),
“max_end”:(df.Val==1)和(df.Val.shift(-1)<1),
“零开始”:(df.Val==0)和(df.Val.shift(1)>0),
“零停止”:(df.Val==0)和(df.Val.shift(-1)>0)}
df=pd.concat([df,pd.DataFrame(特征)],轴=1)
#添加循环组索引
df['cycle\u id']=df.ramp\u start.cumsum()
#按周期id分组并获取相关时间戳
#注:如果严格按天进行循环,也可以按天分组
def get_指示灯(x):
数据={name:x.Date.loc[x[name]].iloc[0]如果x[name].sum()否则为0
对于功能中的名称}
返回pd.系列(数据)
df_ind=df.groupby('cycle_id')。应用(获取指标)
#删除不完整的循环
df_ind=df_ind.loc[~(df_ind==0).any(轴=1)]
#使用数据计算衍生指标
df_ind['total_time_zero']=df_ind['zero_stop']-df_ind['zero_start']
出[199]:
斜坡\u开始最大\u开始最大\u结束\
循环号
1         2018-01-15 00:40:00  2018-01-15 01:20:00  2018-01-15 02:00:00   
2         2018-01-15 04:00:00  2018-01-15 04:40:00  2018-01-15 05:20:00   
3         2018-01-15 07:20:00  2018-01-15 08:00:00  2018-01-15 08:40:00   
4         2018-01-15 10:40:00  2018-01-15 11:20:00  2018-01-15 12:00:00   
零开始零停止总时间零
循环号
1         2018-01-15 03:00:00  2018-01-15 03:40:00        00:40:00  
2         2018-01-15 06:20:00  2018-01-15 07:00:00        00:40:00  
3         2018-01-15 09:40:00  2018-01-15 10:20:00        00:40:00  
4         2018-01-15 13:00:00  2018-01-15 13:40:00        00:40:00  

这是一个有趣的问题。你能告诉我你想要的产品是什么吗?例如,给定上面显示的输入,输出应该是什么,日期列表?字典?这些对象中的值应该是什么?您能显示这些数据的预期结果吗?@johnchase输出可以再次位于数据帧中。显示2018-01-15 01:20:00时的值为0.5(大于0),然后需要20分钟才能达到峰值。在40分钟内达到峰值1.0并开始下降,在40分钟内再次达到0。输出可以在数据帧或列表中,只提供时间戳。谢谢@ArpitGothwal。这些信息应该真正进入问题本身,使其自我包含。格式化后的预期输出将非常有用。谢谢你的回答,它帮助了很多。我还可以得到那个特定时间戳的值吗。我已更新问题以了解输出。要获取值,您可以相应地修改我的函数
get_indicators
。e、 g.通过添加
数据['val\u ramp\u start']=x.val.loc[x['ramp\u start']]].iloc[0]如果x['ramp\u start']].sum()否则0
感谢您的回复。如果我修改它来给我索引值,这个函数会工作吗?因为我已经将我的索引设置为日期。只需要索引+val的值。如果你看zero_start和zeo_stop的输出,这些值是不对的。由于坡道从00:40:00开始,最大终点为02:00:00,因此运行的总时间应为00:40:00-02:00:00,即01:20:00。但是总时间显示为00:40:00
total\u time\u zero
是根据
df\u ind['zero\s]计算得出的