合并两个具有不同日期时间索引的数据帧

时间:2021-02-27 15:59:44

标签: python pandas dataframe merge

我有两个带有时间索引但规模不同的数据帧。第一个每天每 30 分钟有一次数据,另一个每天只有一个数据。我想用第二个数据框的值填充第一个数据框并保持第一个数据框的形状。

首先:

2019-08-26 13:00:00 a 1
2019-08-26 13:30:00 b 2
2019-08-26 14:00:00 c 3
2019-08-26 14:30:00 d 4
2019-08-26 15:00:00 e 5

第二个:

2019-08-25 X
2019-08-26 Y
2019-08-27 Z

想要的结果:

2019-08-26 13:00:00 a 1 Y
2019-08-26 13:30:00 b 2 Y
2019-08-26 14:00:00 c 3 Y
2019-08-26 14:30:00 d 4 Y
2019-08-26 15:00:00 e 5 Y

2 个答案:

答案 0 :(得分:3)

您可以通过标准化 key 的索引在 df1 中创建临时合并 df1,然后您应该能够merge df1 与其他数据帧df2 基于此 merge 键:

df1.assign(key=df1.index.normalize())\
   .merge(df2, left_on='key', right_index=True, how='left').drop('key', 1)

                     A  B  C
2019-08-26 13:00:00  a  1  Y
2019-08-26 13:30:00  b  2  Y
2019-08-26 14:00:00  c  3  Y
2019-08-26 14:30:00  d  4  Y
2019-08-26 15:00:00  e  5  Y

答案 1 :(得分:2)

只是为了把上一个答案放在眼里。 Shubham Sharma 的“魔法”线在以下情况下对我有用:

  1. 使用适当的输入格式将 Date 列转换为 pandas.Timestamp 对象,以便能够对其应用 normalize() 函数 - 如果它不是这种格式,则将引发异常。
  2. Date 列设置为索引。
  3. 使用上一个答案中 Shubham Sharma 的“魔法”台词。

代码可能如下所示:

import pandas as pd

df1 = pd.DataFrame([['2019-08-26 13:00:00', 'a', 1],
                    ['2019-08-26 13:30:00', 'b', 2],
                    ['2019-08-26 14:00:00', 'c', 3],
                    ['2019-08-26 14:30:00', 'd', 4],
                    ['2019-08-26 15:00:00', 'e', 5]], columns=['Date', 'A', 'B'])

df1['Date'] = pd.to_datetime(df1['Date'].astype(str), format='%Y-%m-%d %H:%M:%S')
df1.set_index('Date', inplace=True)

df2 = pd.DataFrame([['2019-08-25', 'X'], ['2019-08-26', 'Y'], ['2019-08-27', 'Z']], columns=['Date', 'A'])
df2['Date'] = pd.to_datetime(df2['Date'].astype(str), format='%Y-%m-%d %H:%M:%S')
df2.set_index('Date', inplace=True)

# Now comes Shubham Sharma's magic line
df3 = df1.assign(key=df1.index.normalize()).merge(df2, left_on='key', right_index=True, how='left').drop('key', 1)

# Set column names (except the index) to A, B and C
df3.columns = ['A', 'B', 'C']