如何高效处理Pandas中的时间序列数据

1 投票
1 回答
694 浏览
提问于 2025-04-17 23:08

我有一些数据集,记录了在特定节点的旅行时间。这些数据以CSV文件的形式存储,每个节点一个文件,格式是这样的:节点名称, 日期时间, 无关字段, MAC地址

我正在用Pandas把这些数据读入一个数据框(DataFrame)中:

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

我想做的是找出一个MAC地址在一个节点出现和下一个节点出现之间的时间差。目前我是在遍历这个数据框,这样做效率不高,而且也不太好用:我尝试的各种排序方式都出现了问题。

  • 我不能只按MAC地址和日期时间排序,因为我需要保留旅行的方向(如果只按日期和时间排序,所有的方向看起来都像是朝一个方向走)。
  • 如果只按MAC地址排序,节点的顺序是保持的(因为它们是按照节点的顺序写入文件的)。

虽然我可能能解决排序的问题,但更大的问题是我对Pandas不太熟悉,我觉得在Pandas中应该有更好的方法来处理这个。我希望在处理结束后得到一个数据集,显示每对节点之间的旅行时间(timediff.total_seconds()或类似的东西),这些节点是MAC地址直接经过的。这一点很重要:假设节点有A、B和C,大部分旅行会是A到B或者B到C(或者反过来),但也有可能一些MAC地址不会在B节点记录,而是直接从A到C。还有可能有些记录是孤立的,MAC地址在某个节点出现,但从未在另一个节点出现。

1 个回答

1

如果数据表是按照每个 mac 地址 的时间顺序排列的,可能你可以这样做:

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

撰写回答