我正在从 MongoDB 数据库获取数据并将其转换为 Pandas 数据框,以便稍后完成其他操作。 MongoDB 数据库包含一堆基于时间的条目,并且由于它们的存储方式,每个通道的每个样本都是其自己的文档。其中一些通道始终在同一时间进行采样,而其他通道则按不同的时间表进行采样。以下是文档的快速示例。
timestamp:
2024-01-05T08:16:30.848+00:00
metaData:
deviceId:
"123"
channelName:
"Channel1"
_id:
659c23016ad87924ff552882
Channel1:
10345
所以当我尝试使用类似的东西从数据库中获取一些频道时
b = pd.DataFrame(list(timeCol.find({'metaData.deviceId':'123','metaData.channelName':{'$in':['Channel1','Channel2','Channel3','Channel4','Channel5']}},{'_id':0,'metaData':0}).sort('timestamp')))
我得到一个如下所示的数据框
timestamp Channel1 Channel2 Channel3 Channel4 Channel5
0 2024-01-05 20:27:31.340 0.0 NaN NaN NaN NaN
1 2024-01-05 20:27:31.382 1.0 NaN NaN NaN NaN
2 2024-01-05 20:27:31.400 NaN 2456 NaN NaN NaN
3 2024-01-05 20:27:31.400 NaN NaN 10.231 NaN NaN
4 2024-01-05 20:27:31.400 NaN NaN NaN 2.4 NaN
但它还有更多条目,因为我通常对几个小时的时间跨度感兴趣。无论如何,正如您所看到的,通道 2-5 通常共享一个时间戳,但通道 1 的速率更高。
有什么方法可以将时间戳列设置为索引,并让 Pandas 仅使用唯一的时间戳条目,然后正确地对其他列进行采样?
我知道我可以通过为每个列创建一个系列,然后合并/连接它们来做到这一点,但我认为这需要为每个通道单独调用数据库,并且我更愿意限制数据库调用以提高速度和效率。我可以请求对数据库进行一些更改,但这就是数据的广播方式(每个通道/设备的单独消息),并且不能保证通道将具有相同的时间戳,但对于某些通道来说,这种情况似乎更常见。还有其他频道的广播速率要高得多,我也需要进行分析,但我计划单独查询这些频道并稍后添加它们。
谢谢!
groupby.first
:
out = df.groupby('timestamp').first()
输出:
Channel1 Channel2 Channel3 Channel4 Channel5
timestamp
2024-01-05 20:27:31.340 0.0 NaN NaN NaN NaN
2024-01-05 20:27:31.382 1.0 NaN NaN NaN NaN
2024-01-05 20:27:31.400 NaN 2456.0 10.231 2.4 NaN
resample
聚合(例如此处使用 mean
):
df['timestamp'] = pd.to_datetime(df['timestamp'])
out = (df.set_index('timestamp')
.resample('100ms').mean()
)
输出:
Channel1 Channel2 Channel3 Channel4 Channel5
timestamp
2024-01-05 20:27:31.300 0.5 NaN NaN NaN NaN
2024-01-05 20:27:31.400 NaN 2456.0 10.231 2.4 NaN