Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 加入日期限制_Python_Pandas_Join - Fatal编程技术网

Python 加入日期限制

Python 加入日期限制,python,pandas,join,Python,Pandas,Join,我有两个数据帧,如下所示: df1 = pd.DataFrame({'Id' : [A, B, A, A, C], 'date' : [01-01-15, 31-01-15, 03-02-15, 03-02-15, 15-03-16], 'attr':[1, 5, 3, 5, 6] }, columns=['Id','date', 'attr']) df2 = pd.DataFrame({'Id' : [A, B, A, A, B], 'date' : [01-02-15, 01-0

我有两个数据帧,如下所示:

df1 = pd.DataFrame({'Id' : [A, B, A, A, C],
 'date' : [01-01-15, 31-01-15, 03-02-15, 03-02-15, 15-03-16],
 'attr':[1, 5, 3, 5, 6]
  }, columns=['Id','date', 'attr'])

df2 = pd.DataFrame({'Id' : [A, B, A, A, B],
 'date' : [01-02-15, 01-01-15, 02-02-15, 03-12-15, 15-03-16],
 'counter':[1, 1, 2, 3, 2]
  }, columns=['Id','date', 'counter'])
第一个包含Id、日期和一些属性。 第二个包含Id、日期和其他属性(计数器随着时间的推移而增加)。 请注意,所有属性都会多次出现

现在,我想根据Id“加入”这两者,但只考虑df2过去最接近的日期

实际上,我的预期产出是:

Id | date     | att | counter
A  | 01-01-15 | 1   | Nan
B  | 31-01-15 | 5   | 1 
A  | 03-02-15 | 3   | 2
A  | 03-02-15 | 5   | 2
C  | 15-03-16 | 6   | NaN
请注意,NaN可以由任何其他合理值(包括0)替换

第一个df包含大约30万行,而第二个df包含大约300万行。

您需要


方向
参数的默认值是
向后
来自文档

两个数据帧必须按键排序

对于左侧数据框中的每一行:

  • “向后”搜索选择右数据帧中“开”键小于或等于左键的最后一行
  • “向前”搜索选择右数据帧中的第一行,其“开”键大于或等于左键
  • “最近”搜索选择右数据帧中的行,其“开”键在绝对距离上最接近左键

我认为这是不可能的,因为你需要一个精确的值来连接。我所能想到的最好的方法是将日期截断为月份,然后根据分组中计数器的天数编写一些自定义函数来加入。谢谢。由于某种原因,我得到以下错误。TypeError:“非类型”对象不可调用。我正在试着调试它,但运气不太好。Id或Date都不为NULL或NaN。当您在玩具数据上运行时,我提供的内容是否有效?如果是这样,那就是你的数据。如果它对玩具数据不起作用,那么它就是版本控制。我正在运行Python 3.6和pandas 0.22。如果它对玩具数据有效,那么你应该提供足够的数据,这样错误就会发生,但要保持最小。它有效。我没有使用datetime64[ns]。谢谢!
pd.merge_asof(df1, df2.sort_values('date'), on='date', by='Id')

  Id       date  attr  counter
0  A 2015-01-01     1      NaN
1  B 2015-01-31     5      1.0
2  A 2015-03-02     3      2.0
3  A 2015-03-02     5      2.0
4  C 2016-03-15     6      NaN