Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.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 2.7 在最近的过去日期合并2个数据帧_Python 2.7_Pandas_Date_Merge - Fatal编程技术网

Python 2.7 在最近的过去日期合并2个数据帧

Python 2.7 在最近的过去日期合并2个数据帧,python-2.7,pandas,date,merge,Python 2.7,Pandas,Date,Merge,我有两个数据帧,列0表示“日期” 次要日期比主要日期多,而且它们不同(尽管时间接近) 我希望合并两个数据帧,将主日期作为参考,并根据主日期之前的直接日期选择要合并的辅助日期(行) main = pd.DataFrame({'Date':pd.to_datetime( ['2013-07-23', '2013-10-28', '2014-01-27', '2014-04-23', '2014-07-22', '2014-10-20', '2015-01-27', '201

我有两个数据帧,列0表示“日期”

次要日期比主要日期多,而且它们不同(尽管时间接近)

我希望合并两个数据帧,将主日期作为参考,并根据主日期之前的直接日期选择要合并的辅助日期(行)

main = pd.DataFrame({'Date':pd.to_datetime(
      ['2013-07-23', '2013-10-28', '2014-01-27', '2014-04-23',
       '2014-07-22', '2014-10-20', '2015-01-27', '2015-04-27',
       '2015-07-21', '2015-10-27', '2016-01-26', '2016-04-26', '2016-07-26'] ) })

         Date
0  2013-07-23
1  2013-10-28
2  2014-01-27
3  2014-04-23
4  2014-07-22
5  2014-10-20
6  2015-01-27
7  2015-04-27
8  2015-07-21
9  2015-10-27
10 2016-01-26
11 2016-04-26
12 2016-07-26

日期应与此逻辑合并,尽管只保留Date Main和两个数据帧的其余列:

(按时间倒序排列)

我发现的解决方案与合并两个最接近的日期有关,但在这种情况下,最接近的日期可能意味着主日期之后的第二个日期违反了“过去”条件

这个看起来很相似,但我不知道如何将它应用到我的案例中


下面是一个使用
merge\u asof
的尝试:

df = pd.merge_asof( main.set_index('Date').sort_index(),
                    sec.set_index('Date',drop=False).sort_index(),
                    left_index=True, 
                    right_index=True,
                    direction='backward')  # backward is the default, so you
                                           # can leave this out if you prefer

df.rename(columns={'Date':'Date_sec'})\
  .sort_index(ascending=False).reset_index()
语法说明:
drop=False
是确保保留辅助数据帧的日期所必需的。如果没有它,合并的数据帧将只包含来自主数据帧的日期

结果:

         Date   Date_sec
0  2016-07-26 2016-07-01
1  2016-04-26 2016-04-01
2  2016-01-26 2016-01-01
3  2015-10-27 2015-10-01
4  2015-07-21 2015-07-01
5  2015-04-27 2015-04-01
6  2015-01-27 2015-01-01
7  2014-10-20 2014-10-01
8  2014-07-22 2014-07-01
9  2014-04-23 2014-04-01
10 2014-01-27 2014-01-01
11 2013-10-28 2013-10-01
12 2013-07-23 2013-07-01

pd.merge\u asof()
谢谢@djk47463!我看到有一个参数tolerance=pd.Timedelta(),但如果我理解正确,它会找到最近的值(可能是将来的值)。如何将其设置为过去?它仅适用于过去最近的匹配,请查看
allow\u exact\u matches
parameter@djk47463从0.20开始,可以将方向设置为向后(默认)、向前或最近。当然,这个问题无关紧要,因为OP想要向后看,我非常感谢你,出于某种原因,我得到了TypeError:merge_asof()得到了一个意外的关键字参数'direction'@Diego你可能有一个旧版本的pandas。我相信
direction
是在0.20.0中添加的,但是
backward
是默认值,所以您可以不使用它。我只是为了清楚起见才在这里添加它,因为有时即使在不必要的时候,也最好使用关键字参数来明确说明。你是对的!熊猫升级。现在我得到了TypeError:“NoneType”对象不能在右侧调用。\u index=True。已经研究过了,但找不到任何线索…@Diego我不确定,但可能是数据问题。我编辑了您的问题,以包含创建两个数据帧的代码。看看这是否对您有效,然后:(1)检查您的实际数据是否具有“Date”的datetime数据类型,(2)检查缺少的值NaN或NaT(不是时间)。您的消息似乎表明某个地方缺少一个值,这是我在没有数据的情况下所能猜到的。谢谢您的版本!我执行了dropna和pd.notnull检查,甚至是np.inf,但仍然得到相同的错误。我将继续检查。。。
df = pd.merge_asof( main.set_index('Date').sort_index(),
                    sec.set_index('Date',drop=False).sort_index(),
                    left_index=True, 
                    right_index=True,
                    direction='backward')  # backward is the default, so you
                                           # can leave this out if you prefer

df.rename(columns={'Date':'Date_sec'})\
  .sort_index(ascending=False).reset_index()
         Date   Date_sec
0  2016-07-26 2016-07-01
1  2016-04-26 2016-04-01
2  2016-01-26 2016-01-01
3  2015-10-27 2015-10-01
4  2015-07-21 2015-07-01
5  2015-04-27 2015-04-01
6  2015-01-27 2015-01-01
7  2014-10-20 2014-10-01
8  2014-07-22 2014-07-01
9  2014-04-23 2014-04-01
10 2014-01-27 2014-01-01
11 2013-10-28 2013-10-01
12 2013-07-23 2013-07-01