[英]Write value (datetime) in pandas dataframe under diff condition
我想将 grouped_measurement 第一次非零出现的日期时间值写入“Start_time”列,并将 grouped_measurement 发生的最后一次写入“End_time”列。 如果 grouped_measurement 为 0,则“Start_time”和“End_time”应等于 0。
我已经尝试了各种 diff() 和 diffna() 选项,但没有成功。 这是我的代码:
import pandas as pd
import numpy as np
import datetime
current_time=datetime.datetime.now()
L=[]
for i in range(22):
L.append(current_time+datetime.timedelta(milliseconds=(i*500)))
# Define input dataframe
df = {'value': [1,1,1,0,0,0,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,0],
'time': L}
df = pd.DataFrame(df,columns= ['value','time'])
# print("Dataframe is:\n",df)
print("Grouping data according to servo positions, please wait...")
df['grouped_measurement'] = df['value'].diff().fillna(df['value']).eq(1).cumsum().mask(df['value'] == 0, 0)
df['Start_time'] = df['grouped_measurement'].diff().fillna(df['time'])
df['End_time'] = df['grouped_measurement'].diff().fillna(df['time'])
print("Dataframe is:\n",df)
我有实际结果:
value time grouped_measurement Start_time End_time
0 1 2019-08-31 19:14:42.259304 1 1.567279e+18 1.567279e+18
1 1 2019-08-31 19:14:42.759304 1 0.000000e+00 0.000000e+00
2 1 2019-08-31 19:14:43.259304 1 0.000000e+00 0.000000e+00
3 0 2019-08-31 19:14:43.759304 0 -1.000000e+00 -1.000000e+00
4 0 2019-08-31 19:14:44.259304 0 0.000000e+00 0.000000e+00
5 0 2019-08-31 19:14:44.759304 0 0.000000e+00 0.000000e+00
6 1 2019-08-31 19:14:45.259304 2 2.000000e+00 2.000000e+00
7 1 2019-08-31 19:14:45.759304 2 0.000000e+00 0.000000e+00
8 1 2019-08-31 19:14:46.259304 2 0.000000e+00 0.000000e+00
9 1 2019-08-31 19:14:46.759304 2 0.000000e+00 0.000000e+00
10 1 2019-08-31 19:14:47.259304 2 0.000000e+00 0.000000e+00
11 0 2019-08-31 19:14:47.759304 0 -2.000000e+00 -2.000000e+00
12 0 2019-08-31 19:14:48.259304 0 0.000000e+00 0.000000e+00
13 0 2019-08-31 19:14:48.759304 0 0.000000e+00 0.000000e+00
14 0 2019-08-31 19:14:49.259304 0 0.000000e+00 0.000000e+00
15 1 2019-08-31 19:14:49.759304 3 3.000000e+00 3.000000e+00
16 1 2019-08-31 19:14:50.259304 3 0.000000e+00 0.000000e+00
17 1 2019-08-31 19:14:50.759304 3 0.000000e+00 0.000000e+00
18 1 2019-08-31 19:14:51.259304 3 0.000000e+00 0.000000e+00
19 1 2019-08-31 19:14:51.759304 3 0.000000e+00 0.000000e+00
20 1 2019-08-31 19:14:52.259304 3 0.000000e+00 0.000000e+00
21 0 2019-08-31 19:14:52.759304 0 -3.000000e+00 -3.000000e+00
而预期输出如下:
value time grouped_measurement Start_time End_time
0 1 2019-08-31 19:14:42.259304 1 2019-08-31 19:14:42.259304 2019-08-31 19:14:43.259304
1 1 2019-08-31 19:14:42.759304 1 2019-08-31 19:14:42.259304 2019-08-31 19:14:43.259304
2 1 2019-08-31 19:14:43.259304 1 2019-08-31 19:14:42.259304 2019-08-31 19:14:43.259304
3 0 2019-08-31 19:14:43.759304 0 0 0
4 0 2019-08-31 19:14:44.259304 0 0 0
5 0 2019-08-31 19:14:44.759304 0 0 0
6 1 2019-08-31 19:14:45.259304 2 2019-08-31 19:14:45.259304 2019-08-31 19:14:47.259304
7 1 2019-08-31 19:14:45.759304 2 2019-08-31 19:14:45.259304 2019-08-31 19:14:47.259304
8 1 2019-08-31 19:14:46.259304 2 2019-08-31 19:14:45.259304 2019-08-31 19:14:47.259304
9 1 2019-08-31 19:14:46.759304 2 2019-08-31 19:14:45.259304 2019-08-31 19:14:47.259304
10 1 2019-08-31 19:14:47.259304 2 2019-08-31 19:14:45.259304 2019-08-31 19:14:47.259304
11 0 2019-08-31 19:14:47.759304 0 0 0
12 0 2019-08-31 19:14:48.259304 0 0 0
13 0 2019-08-31 19:14:48.759304 0 0 0
14 0 2019-08-31 19:14:49.259304 0 0 0
15 1 2019-08-31 19:14:49.759304 3 2019-08-31 19:14:49.759304 2019-08-31 19:14:52.259304
16 1 2019-08-31 19:14:50.259304 3 2019-08-31 19:14:49.759304 2019-08-31 19:14:52.259304
17 1 2019-08-31 19:14:50.759304 3 2019-08-31 19:14:49.759304 2019-08-31 19:14:52.259304
18 1 2019-08-31 19:14:51.259304 3 2019-08-31 19:14:49.759304 2019-08-31 19:14:52.259304
19 1 2019-08-31 19:14:51.759304 3 2019-08-31 19:14:49.759304 2019-08-31 19:14:52.259304
20 1 2019-08-31 19:14:52.259304 3 2019-08-31 19:14:49.759304 2019-08-31 19:14:52.259304
21 0 2019-08-31 19:14:52.759304 0 0 0
你很接近! 在您创建的“grouped_measurement”列上使用 groupby。
df['grouped_measurement'] = df['value'].diff().fillna(1).eq(1).cumsum().where(df['value'].ne(0))
result = (df.join(df.groupby('grouped_measurement')['time']
.agg([('Start_time','min'),('End_time','max')])
, on='grouped_measurement')
.fillna(0,downcast='infer'))
您可能需要pandas 0.25
才能使用.agg([('Start_time','min'),('End_time','max')]
。
编辑
假设时间列是排序的,那么下面的方法就不会依赖groupby,
label_start_end = df['value'].diff().fillna(1, downcast='infer')
df['Start_time'] = df['time'].where(label_start_end.eq(1)).ffill().where(df['value'].eq(1),0)
df['End_time'] = df['time'].where(label_start_end.eq(-1)).bfill().where(df['value'].eq(1),0)
编辑 2(日期时间列中没有 0)
label_start_end = df['value'].diff().fillna(1, downcast='infer')
mask = df['value'].eq(1)
df['Start_time'] = df['time'].where(label_start_end.eq(1)).ffill().where(mask)
df['End_time'] = df['time'].where(label_start_end.eq(-1)).bfill().where(mask)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.