繁体   English   中英

在差异条件下在pandas数据帧中写入值(日期时间)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM