我将尝试一起解决您的两个问题。这看起来像是一份工作pd.merge_asof() https://pandas.pydata.org/pandas-docs/stable/generated/pandas.merge_asof.html,它在最接近匹配的键上合并,而不是仅在精确的键上合并。
示例数据
df1
date value
30/11/17 0.00 51
30/11/17 0.02 53
30/11/17 0.05 65
30/11/17 0.08 58
df2
date value
30/11/17 0.01 61
30/11/17 0.02 63
30/11/17 0.04 65
30/11/17 0.07 68
预处理
df1.date = pd.to_datetime(df1.date, format='%d/%m/%y %H.%M')
df2.date = pd.to_datetime(df2.date, format='%d/%m/%y %H.%M')
df1.set_index('date', inplace=True)
df2.set_index('date', inplace=True)
df1
value
date
2017-11-30 00:00:00 51
2017-11-30 00:02:00 53
2017-11-30 00:05:00 65
2017-11-30 00:08:00 58
df2
value
date
2017-11-30 00:01:00 61
2017-11-30 00:02:00 63
2017-11-30 00:04:00 65
2017-11-30 00:07:00 68
根据最近的索引匹配合并数据帧
merged = pd.merge_asof(df1, df2, left_index=True, right_index=True, direction='nearest')
merged
value_x value_y
date
2017-11-30 00:00:00 51 61
2017-11-30 00:02:00 53 63
2017-11-30 00:05:00 65 65
2017-11-30 00:08:00 58 68
相关性
注意df.corr()
不接受数据作为参数,所以df1.corr(df2)
不起作用。这corr
方法计算您调用它的 DataFrame 中列的成对相关性(docs https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.corr.html).
merged.corr()
value_x value_y
value_x 1.000000 0.612873
value_y 0.612873 1.000000
Notes
上面的用法是pd.merge_asof
保持索引df1
;中的每一行df1
收到最接近的匹配df2
, 有更换, so if df2
行数曾经少于df1
, 的结果merge_asof
将包含来自的重复值df2
。结果将具有相同的行数df1
.
您提到您实际上只关心按相对位置比较行,例如比较第三个值df1
到第三个值df2
。而不是使用merge_asof
,一旦您使用时间索引来获取感兴趣的时间段,您就可以简单地忽略它,并使用以下命令访问底层 numpy 数组df.values
:
# Get a 2D array of shape (4, 1)
df1.values
array([[51],
[53],
[65],
[58]])
# Get a 1D array of shape (4,)
df1.values.flatten()
array([51, 53, 65, 58])
# numpy correlation matrix
pd.np.corrcoef(df1.values.flatten(), df2.values.flatten())
array([[1. , 0.61287265],
[0.61287265, 1. ]])