在尝试合并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]
任何帮助将不胜感激。
答案 0 :(得分:0)
首先反转合并方向。一个更自然的方法是 “基本” DataFrame是 df2 。
第二点要纠正的是,合并应该在 TimeStamp 列上, 转换为 DateTime ,如果是 df2 -时间部分为“已取消” (我假设在两个Source DataFrames TimeStamp 列中都是 string 类型。)
第三个细节是:
外部合并模式会产生奇怪的结果,例如如果 df1 包含行 在 df2 中缺少日期。
在这种情况下,结果将在两个 TimeStamp 中包含带有 NaN 的行 和 Value2 以及 df1 这些行中的 Value ,不带“源” 日期。
因此,考虑到以上言论,我提出以下解决方案:
生成一个系列进行合并:
仅采用 Value1 列:
val1 = df1.set_index(pd.to_datetime(df1.TimeStamp)).Value1
然后执行合并:
并删除当前索引(从头开始创建新索引):
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 足够聪明,可以从源数据中识别格式。