gpt4 book ai didi

python - 使用 Pandas 计算重叠时间范围的持续时间

转载 作者:行者123 更新时间:2023-11-28 18:35:55 26 4
gpt4 key购买 nike

我有类似于下面示例的大型 csv 流量数据文件,为此我需要计算每次数据传输的总字节数和持续时间。时间范围重叠,但必须合并:

first_packet_ts last_packet_ts  bytes_uplink bytes_downlink service    user_id
1441901695012 1441901696009 165 1212 facebook 3
1441901695500 1441901696212 23 4321 facebook 3
1441901698000 1441901698010 242 3423 youtube 4
1441901698400 1441901698500 423 2344 youtube 4

期望的输出:

 duration     bytes_uplink      bytes_downlink    service          user_id
1200 188 5533 facebook 3
110 665 5767 youtube 4

我目前使用类似以下几行的内容:

df = pd.read_csv(input_file_path)
df = df.groupby(['service', 'user_id'])
durations = df.apply(calculate_duration)
df = df[['bytes_uplink', 'bytes_downlink']].sum()
df = df.reset_index()

calculate_duration 函数(如下)迭代每个的内容组,合并重叠的时间间隔,然后返回一个数据帧,然后将其连接到求和数据帧 df。

def calculate_duration(group):
ranges = group[['first_packet_ts', 'last_packet_ts']].itertuples()
duration = 0
for i,current_start, current_stop in ranges:
for i, start, stop in ranges:
if start > current_stop:
duration += current_stop - current_start
current_start, current_stop = start, stop
else:
current_stop = max(current_stop, stop)
duration += current_stop - current_start
return duration

这种方法非常慢,因为它涉及迭代并为每个组调用 apply 方法。

是否有更有效的方法来计算数据传输的持续时间、合并重叠间隔、使用 pandas(以某种方式避免迭代?)最好不要求助于 cython?

最佳答案

这个怎么样? (已经计时,可能会慢一点......)

pd.pivot_table(df, columns='user_id', index='service',
values=['bytes_uplink', 'bytes_downlink'], aggfunc=sum)

编辑:我不认为这比你的更有效,但你可以尝试以下方法:

# create dummy start/end dataframe
df = pd.DataFrame({'end':pd.Series([50, 100, 120, 150]), 'start':pd.Series([30, 0, 40, 130])})
df = df[['start', 'end']]
df = df.sort('start')

df['roll_end'] = df.end.cummax()
df.roll_end = df.roll_end.shift()

df['new_start'] = df.start
overlap = df.start - df.roll_end < 0
# if start is before rolling max end time then reset start to rolling max end time
df.new_start[overlap] = df.roll_end[overlap]

# if the new start is after end, then completely overlapping
print np.sum([x for x in df.end - df.new_start if x > 0])

关于python - 使用 Pandas 计算重叠时间范围的持续时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32520072/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com