我正在从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相关问答推荐

基于字符串匹配条件合并两个帧

ThreadPoolExecutor和单个线程的超时

如何合并两个列表,并获得每个索引值最高的列表名称?

在输入行运行时停止代码

在Python中使用yaml渲染(多行字符串)

干燥化与列姆化的比较

如何从pandas DataFrame中获取. groupby()和. agg()之后的子列?

如何根据rame中的列值分别分组值

使用polars. pivot()旋转一个框架(类似于R中的pivot_longer)

高效生成累积式三角矩阵

为什么Visual Studio Code说我的代码在使用Pandas concat函数后无法访问?

递归链表反转与打印语句挂起

是否将Pandas 数据帧标题/标题以纯文本格式转换为字符串输出?

Python键盘模块不会立即检测到按键

如何判断特定的OPC UA node 是否已经存在Asyncua?

安装PyTorch时出现CondaVerificationError

两极中的`df.Query()`?

如何将数据从一个数据框按行添加到另一个数据框,仅当两个数据框中第一列的值相等时?

Abstral@Property-实例化部分实现的类?

如何在层之间添加任意函数?