在固定持续时间窗口中对满足多个条件的行进行分组

2024-09-04 19:21:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个df如下。假设df被时间戳索引为dtype='datetime64[ns]',即1970-01-01 00:00:27.603046999。我在这里贴假时间戳。你知道吗

Timestamp    Address    Type    Arrival_Time   Time_Delta
0.1           2           A      0.25            0.15
0.4           3           B      0.43            0.03
0.9           1           B      1.20            0.20
1.3           1           A      1.39            0.09
1.5           3           A      1.64            0.14
1.7           3           B      1.87            0.17
2.0           3           A      2.09            0.09
2.1           1           B      2.44            0.34
  • 我有三个独特的“地址”(1,2,3)。你知道吗
  • 我有两种独特的“类型”(A,B)

现在我尝试用简单的方式做两件事(可能在Panda中使用pd.Grouperpd.Groupby函数)。你知道吗

  1. 我想按1个持续时间的固定bin对行进行分组(使用时间戳值)。然后在每个1秒的箱子中,仅当“Type”=A时,为每个“address”找到“Time_delta”的平均值和总和。

  2. 我想按1个持续时间的固定bin对行进行分组(使用时间戳值)。然后在每个箱子中,针对每个“地址”,找到到达时间的平均值和总和*。

IAT = Arrival Time (i) - Arrival Time (i-1)

注:如果时间戳持续时间/长度为100秒,那么输出数据帧中应该正好有100行,每个地址有6列,即2(平均值,总和)。你知道吗

For Problem 1:

我尝试了以下代码:

 df = pd.DataFrame({'Timestamp': Timestamp, 'Address': Address, 
                   'Type': Type, 'Arrival_Time': Arrival_time, 'Time_Delta': Time_delta})
# Set index to Datetime
index = pd.DatetimeIndex(df[df.columns[3]]*10**9) # Convert timestamp into format
df = df.set_index(index) #  Set timestamp as index

df_1 = df[df.columns[2]].groupby([pd.TimeGrouper('1S'), df['Address']]).mean().unstack(fill_value=0)

结果如下:

Timestamp             1     2      3                          
1970-01-01 00:00:00  0.20  0.15  0.030
1970-01-01 00:00:01  0.09  0.00  0.155
1970-01-01 00:00:02  0.34  0.00  0.090

如您所见,它给出了1S bin中每个地址的平均时间δ,但我想添加第二个条件,即仅当Type=A时才找到每个地址的平均值。我希望问题1现在已经清楚了。你知道吗

For Problem 2: Its a bit complicated. I want to do get Mean IAT for each address in the same format (See below):

一种可能的方法是在原始df中添加一个额外的列作为df['IAT'],其中

for in range (1, len(df))
    i = 0
    df['IAT'] = df['Arrival_Time'][i] - df['Arrival_Time'][i-1] i =
    i=i+1

如果类型=A,则应用上述代码查找每个地址的IAT平均值

Actual Data

Timestamp                       Address               Type            Time Delta     Arrival Time                              
1970-01-01 00:00:00.000000000  28:5a:ec:16:00:22     Control frame   0.000000    Nov 10, 2017 22:39:20.538561000
1970-01-01 00:00:00.000287000  28:5a:ec:16:00:23      Data frame     0.000287   Nov 10, 2017 22:39:20.548121000 
1970-01-01 00:00:00.000896000  28:5a:ec:16:00:22     Control frame   0.000609   Nov 10, 2017 22:39:20.611256000
1970-01-01 00:00:00.001388000  28:5a:ec:16:00:21        Data frame    0.000492     Nov 10, 2017 22:39:20.321745000

                                     ...               ...   

Tags: dfindextimeaddress地址type时间frame