熊猫在名字和最近日期上合并

我正在尝试合并两个数据框,分别是name和最近的日期(WRT左边的数据框)。在我的研究中,我在这里发现了一个类似的问题,但它不能解释这个名字。从上面的问题来看,似乎没有一种方法可以通过merge实现这一点,但是我看不到另一种方法可以实现不使用pandas merge函数的两个参数的连接

有没有一种方法可以通过合并来实现这一点?如果不是,那么什么才是合适的方法呢

我将发布一个副本,我已经尝试了,但这是一个确切的日期,这将不会工作合并尝试它。最重要的一行是最后一行,在这里我创建了data3 dataframe

data=pd.read\u csv(“edgar14Afacts.csv”,parse\u dates={“dater”:[2]},推断\u datetime\u format=True)
data2=pd.read\u csv(“sdcmergersdata.csv”,parse\u dates={“dater”:[17]},expert\u datetime\u format=True)
列表(data2.columns.values)
data2.rename(columns=lambda x:x.replace('\r\n',''),inplace=True)
data2.rename(columns=lambda x:x.replace('\n',''),inplace=True)
data2.rename(columns=lambda x:x.replace('\r',''),inplace=True)
data2=data2.rename(列={'Acquiror Name':'Name'})
data2=data2.rename(列={'dater':'date'})
data=data.rename(列={'dater':'date'})
列表(data2.columns.values)
数据[“名称”]=数据[“名称”].map(str.lower)
data2[“name”]=data2['name'].map(str.lower)
数据2['date'].fillna(方法='pad')
数据['namer1']=数据['name']
数据['dater1']=数据['date']
data2['namer2']=data2['name']
data2['dater2']=data2['date']
打印数据头()
打印数据2.head()
data['name']=data['name'].map(lambda x:str(x)[:4])
data2['name']=data2['name'].map(lambda x:str(x)[:4])
data3=pd.merge(数据,data2,how='left',on=['date','name'])
数据3.to_csv(“check.csv”)

这是超级晚了,但希望它有助于新的答案寻求者。我在这里回答了一个类似的问题

在熊猫中使用了一种新的方法:

pandas.merge\u asof()

您感兴趣的参数将是方向公差左侧,以及右侧

在@hernamesbarbara answer&数据:

资料

a=“”时间点,测量
2014-01-01 00:00:00,78
2014-01-02 00:00:00,29
2014-01-03 00:00:00,5
2014-01-04 00:00:00,73
2014-01-05 00:00:00,40
2014-01-06 00:00:00,45
2014-01-07 00:00:00,48
2014-01-08 00:00:00,2
2014-01-09 00:00:00,96
2014-01-10 00:00:00,82
2014-01-11 00:00:00,61
2014-01-12 00:00:00,68
2014-01-13 00:00:00,8
2014-01-14 00:00:00,94
2014-01-15 00:00:00,16
2014-01-16 00:00:00,31
2014-01-17 00:00:00,10
2014-01-18 00:00:00,34
2014-01-19 00:00:00,27
2014-01-20 00:00:00,58
2014-01-21 00:00:00,90
2014-01-22 00:00:00,41
2014-01-23 00:00:00,97
2014-01-24 00:00:00,7
2014-01-25 00:00:00,86
2014-01-26 00:00:00,62
2014-01-27 00:00:00,91
2014-01-28 00:00:00,0
2014-01-29 00:00:00,73
2014-01-30 00:00:00,22
2014-01-31 00:00:00,43
2014-02-01 00:00:00,87
2014-02-02 00:00:00,56
2014-02-03 00:00:00,45
2014-02-04 00:00:00,25
2014-02-05 00:00:00,92
2014-02-06 00:00:00,83
2014-02-07 00:00:00,13
2014-02-08 00:00:00,50
2014-02-09 00:00:00,48
2014-02-10 00:00:00,78"""
b=“”时间点,测量
2014-01-01 00:00:00,78
2014-01-08 00:00:00,29
2014-01-15 00:00:00,5
2014-01-22 00:00:00,73
2014-01-29 00:00:00,40
2014-02-05 00:00:00,45
2014-02-12 00:00:00,48
2014-02-19 00:00:00,2
2014-02-26 00:00:00,96
2014-03-05 00:00:00,82
2014-03-12 00:00:00,61
2014-03-19 00:00:00,68
2014-03-26 00:00:00,8
2014-04-02 00:00:00,94
"""

解决方案

将熊猫作为pd导入
从熊猫导入读取
从io导入StringIO
df1=pd.read\u csv(StringIO(a),parse\u dates=['timepoint'])
df2=pd.read\u csv(StringIO(b),parse\u dates=['timepoint'])
df1['timepoint']=pd.to_datetime(df1['timepoint'])
df2['timepoint']=pd.to_datetime(df2['timepoint'])
#将其转换为索引,这样我们可以保留日期\开始\时间列,这样您就可以验证合并逻辑
df1.index=df1['timepoint']
df2.index=df2['timepoint']
#魔术发生在下面,检查方向和公差参数
#如果需要,可以设定合并数据的最大公差
tol=pd.Timedelta('3天'
df3=pd.merge\U asof(左=df1,右=df2,右=True,左=True,方向为最近,公差为tol)

输出

df3.head()
时间点×测量值×时间点×测量值
时点
2014-01-01  2014-01-01  78  2014-01-01  78
2014-01-02  2014-01-02  29  2014-01-01  78
2014-01-03  2014-01-03  5   2014-01-01  78
2014-01-04  2014-01-04  73  2014-01-01  78
2014-01-05  2014-01-05  40  2014-01-08  29

发表评论