Python 如何在时间序列行上迭代并获得特定值的时间戳?
这里的值从0增加到1,在短时间内保持1.0,然后再次开始减小到0。 我有一个巨大的数据框架,其中的值每天都以这种模式波动 我的问题是,我如何找到值从0增加到某个值的时间戳或时间,并说1.0(有时可能大于1,但总是小于1.5)是峰值。 然后是1.0的持续时间,再减少到0需要多长时间。我需要找出这种行为的平均值 输出应该是时间戳,时间戳val刚大于0,从时间戳到val达到峰值,再到时间戳变为0。从0到再次0的总时间。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
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:00total\u time\u zero
是根据df\u ind['zero\s]计算得出的