我有两个数据帧,它们都用时间戳值进行索引,如"2021-03-23 13:04:00.13400+00:00"。
我想在某些列上计算它们之间的差异,但问题是它们没有时间对齐,并且具有不同的行数。
有没有一种好的方法可以使所有元素的时间差小于特定量,并在其他情况下加入NaN?
编辑:
数据帧1:
|index| val1 | val 2 |
|--------------------------------| ---- | ---- |
|2021-03-23 13:04:00.134000+00:00| 200 | 50 |
|2021-03-23 13:34:00.134000+00:00| 100 | 10 |
|2021-03-23 14:04:00.134000+00:00| 100 | 10 |
数据帧2:
|index| val1 | val 2 |
|--------------------------------| ---- | ---- |
|2021-03-23 13:24:00.134000+00:00| 200 | 50 |
|2021-03-23 14:34:00.134000+00:00| 100 | 10 |
假设时间增量为20分钟的预期输出(数据帧1和数据帧2的列之间的差(:
|index| val1 | val 2 |
|--------------------------------| ---- | ---- |
|2021-03-23 13:04:00.134000+00:00| 0 | 0 |
|2021-03-23 13:44:00.134000+00:00| NaN | NaN |
|2021-03-23 15:04:00.134000+00:00| NaN | NaN |
首先使用merge_asof
:
df = pd.merge_asof(df1,
df2,
left_index=True,
right_index=True,
tolerance=pd.Timedelta('20Min'),
direction='forward',
suffixes=('','_'))
print (df)
val1 val2 val1_ val2_
index
2021-03-23 13:04:00.134000+00:00 200 50 200.0 50.0
2021-03-23 13:34:00.134000+00:00 100 10 NaN NaN
2021-03-23 14:04:00.134000+00:00 100 10 NaN NaN
然后减去相同的列(差值仅_
加到末尾(:
new = df.columns[df.columns.str.endswith('_')]
print (new)
Index(['val1_', 'val2_'], dtype='object')
orig = new.str.replace('_','')
print (orig)
Index(['val1', 'val2'], dtype='object')
df[orig] = df[orig].sub(df[new].to_numpy())
df = df.drop(new, axis=1)
print (df)
val1 val2
index
2021-03-23 13:04:00.134000+00:00 0.0 0.0
2021-03-23 13:34:00.134000+00:00 NaN NaN
2021-03-23 14:04:00.134000+00:00 NaN NaN