我正在从MongoDB数据库获取数据,并将其转换为Pandas DataFrame,以便稍后完成其他操作.MongoDB数据库包含一组基于时间的条目,由于它们的存储方式,每个频道的每个样本都是它自己的文档.其中一些频道总是在同一时间采样,而另一些频道则在不同的时间表上.下面是一个文档的快速示例.

timestamp:
    2024-01-05T08:16:30.848+00:00
metaData:
    deviceId:
        "123"
    channelName:
        "Channel1"
_id:
    659c23016ad87924ff552882
Channel1:
    10345

因此,当我try 使用如下内容从数据库中获取一些频道时

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

但它有更多的条目,因为我通常对几个小时的时间跨度感兴趣.无论如何,如您所见,Channels2-5通常共享一个时间戳,但Channel1的速率更高.

Is there any way that I can set the timestamp column to be the index and have Pandas only use unique entries for timestamp and then correctly sample the other columns?

我知道我可能可以通过 for each 列创建一个系列,然后合并/加入它们来做到这一点,但我认为这将需要 for each 通道单独调用数据库,并且为了速度和效率,我更愿意限制数据库调用.我可以请求对数据库进行一些更改,但这是数据广播的方式(每个频道/设备都有单独的消息),没有什么能保证频道会在相同的时间戳上,但这似乎更多地发生在某些频道上.还有其他频道以更高的速度播放,我也需要在我的分析中工作,但我计划单独查询这些频道,稍后再添加它们.

谢谢!

推荐答案

如果要合并公共时间戳,请使用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毫秒)上聚合,请使用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

以第一个时间戳为原点的变体:

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

out = df.set_index('timestamp').resample('100ms', origin='start').mean()

输出:

                         Channel1  Channel2  Channel3  Channel4  Channel5
timestamp                                                                
2024-01-05 20:27:31.340       0.0    2456.0    10.231       2.4       NaN

Python相关问答推荐

当变量也可以是无或真时,判断是否为假

如何判断LazyFrame是否为空?

在使用Guouti包的Python中运行MPP模型时内存不足

拆分pandas列并创建包含这些拆分值计数的新列

返回nxon矩阵的diag元素,而不使用for循环

理解Python的二分库:澄清bisect_left的使用

如何在图片中找到这个化学测试条?OpenCV精明边缘检测不会绘制边界框

Python 3.12中的通用[T]类方法隐式类型检索

如何将ctyles.POINTER(ctyles.c_float)转换为int?

时间序列分解

优化pytorch函数以消除for循环

如何在python polars中停止otherate(),当使用when()表达式时?

导入...从...混乱

为什么NumPy的向量化计算在将向量存储为类属性时较慢?'

如何从需要点击/切换的网页中提取表格?

我的字符串搜索算法的平均时间复杂度和最坏时间复杂度是多少?

在两极中过滤

基于另一列的GROUP-BY聚合将列添加到Polars LazyFrame

如果有2个或3个,则从pandas列中删除空格

如何求相邻对序列中元素 Select 的最小代价