如何用更Pythonic的日期范围替换此SQL查询

时间:2019-01-13 05:22:33

标签: python sql pandas

我有两个熊猫数据框:

# DataFrame A

  ID      Date      equity
1078604 2000-03-31  145454
1078604 2000-06-30  138536
1078604 2000-09-30  143310

上面的框架包含超过200,000行的公司,这些公司的ID和资产值在季度末。

# DataFrame B

  ID     OtherId  Start       End
1078604     25    1986-06-30  2006-11-04
1049734     94    1986-06-30  1992-10-30
1064894     96    1986-06-30  1990-08-31

帧B包含相同的ID和另一个标识符(OtherId),其中OtherId对从StartEnd的日期有效。

对于合并,我现在依靠此pandasql语句来达到目的:

import pandasql as ps
def merge_ranges_simple(A, B, sqlcode):
    return(ps.sqldf(sqlcode,locals()))

sqlcode = '''SELECT A.ID, A.equity, b.OtherId 
 from A, B 
 where A.ID = B.ID and A.Date >= B.Start and A.Date <= B.End'''

C = merge_ranges_simple(A, B, sqlcode)

结果框架产生一个框架,其中IDOtherId在正确的日期匹配。 (我不太担心不包括股权价值。)

但是我想知道,如果没有SQL,python和pandas不能做同样的事情吗?

1 个答案:

答案 0 :(得分:0)

如果我理解正确:

让我们假设第一个数据帧(通过稍微更改ID和日期中的值来创建工作示例):

>>df

    ID      Date        equity
0   1139710 2000-03-31  145454
1   1139710 2000-06-30  138536
2   1022764 2000-09-30  143310

和第二个:

>>df1

    ID      OtherId Start       End
0   1139710 21      2000-06-29  2000-06-30
1   1078604 25      1986-06-30  2006-11-04
2   1049734 94      1986-06-30  1992-10-30
3   1064894 96      1986-06-30  1990-08-31

使用pd.merge()

df_new=df.merge(df1,on='ID')
>>df_new
    ID      Date        equity  OtherId Start       End
0   1139710 2000-03-31  145454  21      2000-06-29  2000-06-30
1   1139710 2000-06-30  138536  21      2000-06-29  2000-06-30

使用pd.series.between()跟踪您的情况:

df_new[df_new.Date.between(df_new.Start,df_new.End)]

    ID      Date        equity  OtherId Start       End
1   1139710 2000-06-30  138536  21      2000-06-29  2000-06-30

希望这会有所帮助。