我正在使用多个测量集,每个测量集包含两个值:日期时间和温度。例如:
# measurement 1:
time | value
00:00:00 | 10.1
00:00:10 | 10.12
00:00:20 | 10.14
00:00:30 | 10.12
00:00:40 | 10.11
00:00:50 | 10.13
# measurement 2:
time | value
00:00:01 | 10.11
00:00:11 | 10.13
00:00:21 | 10.14
00:00:31 | 10.12
00:00:41 | 10.12
00:00:51 | 10.11
# measurement 3:
time | value
00:00:00 | 10.2
00:00:10 | 10.22
00:00:20 | 10.24
00:00:30 | 10.22
00:00:40 | 10.21
00:00:50 | 10.23
我在pandas数据帧中加载这些集合,并使用外部联接将它们合并到一个数据框中:
df = pd.merge(left=df1, right=df2, how='outer', left_on='time', right_on='time', suffixes=("1", "2"))
我想平均三个数据帧的值,但是: 有时时间不完全相同,导致不同行的值,使得取平均值很困难。例如,测量2和测量3的连接:
# measurement 2 & 3 merged:
time | value2 | value3
00:00:01 | 10.11 | -
00:00:11 | 10.13 | -
00:00:21 | 10.14 | -
00:00:31 | 10.12 | -
00:00:41 | 10.12 | -
00:00:51 | 10.11 | -
00:00:00 | - | 10.2
00:00:10 | - | 10.22
00:00:20 | - | 10.24
00:00:30 | - | 10.22
00:00:40 | - | 10.21
00:00:50 | - | 10.23
在这种情况下,时间不完全相同,有没有办法让它们在同一行上,以便它们可以被平均?
有时设备已多次导出数据(在不同时间)。这意味着某些测量值不是唯一的(完全相同的时间和完全相同的值)。在平均时,我如何确保不考虑这些(双重)测量?
希望有人可以提供帮助。
编辑:添加了图片和一些说明 我已经绘制了六个数据集。为了能够更好地解释我已经将0,10,20,30,40和50添加到不同的图形中,因为否则一些将在彼此之上。黄色,品红色和青色测量完全在彼此之上,在值和日期时间,因为它们来自同一来源(除了数据导出多次)。
绿色和红色数据集的值(大约40)不同,并且几乎在同一时间测量(例如可以关闭几分钟)。
从所有这些测量中我想创建平均线。由于洋红色,青色和黄色相同,平均值应该是它们的值之一。但从某一点来看,有蓝色,绿色和红色。在这种情况下,我正在寻找计算的平均值,但日期时间并不完全相同。
答案 0 :(得分:0)
为了获得同一col上的value1,value2和value3,我使用了:
df = pd.concat([df1, df2, df3])
以下示例与您的相似:
import pandas as pd
df1 = pd.DataFrame({'Time': ['00:00:00', '00:00:10', '00:00:20', '00:00:30', '00:00:40', '00:00:50'],
'Value': ['10', '1', '2', '3', '4', '8']})
df2 = pd.DataFrame({'Time': ['00:00:01', '00:00:11', '00:00:21', '00:00:31', '00:00:41', '00:00:51'],
'Value': ['10', '1', '2', '3', '4', '8']})
df3 = pd.DataFrame({'Time': ['00:00:00', '00:00:10', '00:00:20', '00:00:30', '00:00:40', '00:00:50'],
'Value': ['10', '1', '2', '3', '4', '8']})
df = pd.concat([df1, df2, df3])
print(df):
Time Value
0 00:00:00 10
1 00:00:10 1
2 00:00:20 2
3 00:00:30 3
4 00:00:40 4
5 00:00:50 8
0 00:00:01 10
1 00:00:11 1
2 00:00:21 2
3 00:00:31 3
4 00:00:41 4
5 00:00:51 8
0 00:00:00 10
1 00:00:10 1
2 00:00:20 2
3 00:00:30 3
4 00:00:40 4
5 00:00:50 8
答案 1 :(得分:0)
解决了它:
我首先连接了所有无重复的条目:
for idf, df in enumerate(data[:-1]):
if idf == 0:
df_new = data[idf]
df_new = pd.concat([df_new, data[idf+1][(~(data[idf+1].datetime.isin(df_new.datetime)) | ~(data[idf+1].value.isin(df_new.value)))]])
然后我设置索引:
df_new = df_new.set_index('datetime')
最后我重新取样并采取平均值:
avg = df_new.resample('1800s').mean().dropna()
这导致正确的平均值。