合并熊猫数据框时出现KeyError:名称:TimeStamp,dtype:datetime64 [ns]

时间:2019-08-28 07:22:59

标签: python-3.x pandas dataframe merge datetime-format

在尝试合并datetime列上的两个数据框时出现错误

df1所在的位置:

TimeStamp                Value1

01-01-2019 00:00:00       v1

df2将具有:

TimeStamp                Value2

01-01-2019 9:23:52        v5
01-01-2019 10:33:52       v6
01-01-2019 11:43:52       v7
.
.

我需要什么:

TimeStamp                Value2    Value1

01-01-2019 9:23:52        v5        v1
01-01-2019 10:33:52       v6        v1
01-01-2019 11:43:52       v7        v1
.
.

但当前df2具有:空数据帧,列:[TimeStamp,Value2]

则预期输出应为:

TimeStamp                        Value2    Value1

01-01-2019  00:00:00              None        v1

我尝试过的事情:

full_merged=df1.merge(df2, left_on=pd.to_datetime(df2['TimeStamp'],format='%Y-%m-%d'), right_on=pd.to_datetime(df1['TimeStamp'],format='%Y-%m-%d'),how='outer')

出现以下错误:

raise KeyError(key) KeyError: 0 2019-08-27 Name: TimeStamp, dtype: datetime64[ns]

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

首先反转合并方向。一个更自然的方法是 “基本” DataFrame是 df2

第二点要纠正的是,合并应该在 TimeStamp 列上, 转换为 DateTime ,如果是 df2 -时间部分为“已取消” (我假设在两个Source DataFrames TimeStamp 列中都是 string 类型。)

第三个细节是:

  • 要合并到 df2 的对象应该是 df1 中的 Value1 列。
  • 合并模式( how )应该位于 left

外部合并模式会产生奇怪的结果,例如如果 df1 包含行 在 df2 中缺少日期。

在这种情况下,结果将在两个 TimeStamp 中包含带有 NaN 的行 和 Value2 以及 df1 这些行中的 Value ,不带“源” 日期。

因此,考虑到以上言论,我提出以下解决方案:

生成一个系列进行合并:

  • 来自 df1 ,索引设置为 TimeStamp 列,覆盖为 DateTime
  • 仅采用 Value1 列:

    val1 = df1.set_index(pd.to_datetime(df1.TimeStamp)).Value1
    

然后执行合并

  • df2 ,索引设置为 TimeStamp 列,覆盖为 DateTime , 并取消了 time 部分
  • val1
  • 关于两个来源的索引,
  • 模式下
  • 并删除当前索引(从头开始创建新索引):

    df2.set_index(pd.to_datetime(df2.TimeStamp).dt.floor('d'))\
        .merge(val1, left_index=True, right_index=True, how='left')\
        .reset_index(drop=True)
    

结果是:

             TimeStamp Value2 Value1
0  01-01-2019 09:23:52     v5     v1
1  01-01-2019 10:33:52     v6     v1
2  01-01-2019 11:43:52     v7     v1

因此,尽管合并仅在 date 部分进行,但结果仍然具有 来自 df2 的原始 TimeStamp

编辑

您的代码也失败了,因为 TimeStamp 列的实际格式 是“ day-month-year-year”,而您指定了%Y-%m-%d(year-month-day)。 我的建议:如果不需要,请不要指定日期/时间格式。 pd.to_datetime 足够聪明,可以从源数据中识别格式。