如何计算时间段的连续出现次数?- Pandas python

3

I have a dataframe like this:

datetime              levels       shear
2016-05-01 00:10:00    100           5
2016-05-01 00:10:00    200           6 
2016-05-01 00:10:00    300           10
2016-05-01 00:10:00    400           11
2016-05-01 00:20:00    100           7  
2016-05-01 00:20:00    300           10
2016-05-01 00:30:00    100           5
2016-05-01 00:30:00    200           9
2016-05-01 00:30:00    300           12
2016-05-01 00:30:00    400           15
2016-05-01 00:40:00    100           19
2016-05-01 00:40:00    200           2
2016-05-01 00:40:00    300           18

这段内容涉及IT技术,需要翻译的是“每10分钟间隔内不同高度的风切变”。我的任务是将其按照层次分组,然后计算每个层次连续出现的风切变。因此,首先我会创建另一列,用于记录每个层次连续数据之间的时间差:

data3_5['Delta'] = data3_5.sort_values(['levels','datetimes']).groupby('levels')['datetimes'].diff()

然后定义一个函数来执行连续出现相同时间差的滚动计数:
  def rolling_count(val):
    if val == rolling_count.previous:
       rolling_count.count +=1
    else:
       rolling_count.previous = val
       rolling_count.count = 1
  return rolling_count.count
 rolling_count.count = 0 #static variable
 rolling_count.previous = None #static variable

应用函数并添加新列:

data3_5['count'] = data3_5.sort_values(['levels','datetimes']).groupby('levels')['index'].diff().apply(rolling_count)

然后最后打印输出结果:
group = data3_5.groupby('levels', as_index=False)
group_keys = sorted(list(group.groups.keys()))

for each in range(0,len(group_keys)):
    group_result = group.get_group(group_keys[each])
    print(group_result)

以下是部分结果:
datetime              levels  shear  Delta     count
2016-05-01 00:10:00   100     5      NaT       1
2016-05-01 00:20:00   100     7      00:10:00  1
2016-05-01 00:30:00   100     5      00:10:00  2
2016-05-01 00:40:00   100     19     00:10:00  3
datetime              levels  shear  Delta     count
2016-05-01 00:10:00   200     6      NaT       1
2016-05-01 00:30:00   200     9      00:20:00  1
2016-05-01 00:40:00   200     2      00:10:00  1

这不是期望的结果,存在两个问题: 1. 每个层级的第一个计数将被视为 NaT,因此下一个连续的值出现时将被视为第一次出现。 2. 类似于问题1,对于200级别,第三个结果应该计为2。

我该如何修复?谢谢。

1个回答

3

让我们试一下:

首先,让我们确保 df['datetime'] 确实是 datetime 对象:

df['datetime'] = pd.to_datetime(df['datetime'])

df['Delta'] = df.groupby('levels')['datetime'].transform(lambda x: x-x.shift(1))
df['count'] = df.groupby('levels')['Delta'].transform(lambda x : x.le(pd.Timedelta('10 minutes')).cumsum())
df.sort_values(by='levels')

输出:

              datetime  levels  shear    Delta  count
0  2016-05-01 00:10:00     100      5      NaT      0
4  2016-05-01 00:20:00     100      7 00:10:00      1
6  2016-05-01 00:30:00     100      5 00:10:00      2
10 2016-05-01 00:40:00     100     19 00:10:00      3
1  2016-05-01 00:10:00     200      6      NaT      0
7  2016-05-01 00:30:00     200      9 00:20:00      0
11 2016-05-01 00:40:00     200      2 00:10:00      1
2  2016-05-01 00:10:00     300     10      NaT      0
5  2016-05-01 00:20:00     300     10 00:10:00      1
8  2016-05-01 00:30:00     300     12 00:10:00      2
12 2016-05-01 00:40:00     300     18 00:10:00      3
3  2016-05-01 00:10:00     400     11      NaT      0
9  2016-05-01 00:30:00     400     15 00:20:00      0

谢谢Scott,你的解决方案非常清晰和直接,我会尝试一下。我认为将groupby结果直接附加为原始数据框的新列会比事后使用get_group获得groupby结果更好,后者更难处理,你有什么建议? - lok lok

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接