如何在熊猫中有效地处理时间序列数据

时间:2014-03-20 13:18:23

标签: python sorting pandas time-series

我有表示过去给定节点的旅行时间的数据集。每种节点的数据都采用以下格式的CSV文件: node name, datetime, irrelevant field, mac address

我在Pandas中将它们读入一个DataFrame:

dfs = [pd.read_csv(f, names=CSV_COLUMNS, parse_dates=[1]) for f in files]
return pd.concat(dfs)

我想要做的是找到MAC地址和#39;之间的时差。在一个节点和下一个节点出现。现在,我正在循环生成的DataFrame,这不是有效的,并且不起作用:我试图对数据进行排序的每一种方式都会导致问题。

  • 我无法通过MAC和日期和时间对其进行排序,因为我需要保留行进方向(按日期和时间排序会导致所有方向看起来像正方向)。
  • 仅按MAC排序可使节点按顺序排列(因为它们按节点顺序推入文件中)

虽然我可能能够找出排序问题,但更大的问题是我对熊猫的新手并且我打赌在Pandas中这是一个正确的方法。在处理结束时我想要的是一个数据集,显示MAC 直接在之间传输的每对节点的传输时间(timediff.total_seconds()或类似)。最后一点很重要:对于节点为A,B和C的布局,大多数行程将是AB或BC(或反向),但有些MAC可能无法在B处注册并将进入A对于C.也有可能一些外观将是孤立的,其中MAC出现在一个节点但从未出现在另一个节点上。

1 个答案:

答案 0 :(得分:1)

如果数据框按每个mac address的日期时间排序,您可以这样做:

grb = df.groupby('mac address')
df['origin'] = grb['node name'].transform(pd.Series.shift, 1)
df['departure time'] = grb['datetime'].transform(pd.Series.shift, 1)

,旅行时间为:

df['travel time'] = df['departure time'] - df['datetime']

如果节点名是字符串,则路径为:

df['path'] = df['origin'] + '-' + df['node name']

编辑:假设旅行时间不能为负,这可能会更快:

df.sort(['mac address', 'datetime'], inplace=True)

df['origin'] = df['node name'].shift(1)
df['departure time'] = df['datetime'].shift(1)

# correct for the places where the mac addresses change
idx = df['mac address'] != df['mac address'].shift(1)
df.loc[idx, 'origin'] = np.nan
df.loc[idx, 'departure time'] = np.nan