插值两个Dataframes Pandas之间的日期列

时间:2017-04-03 20:56:17

标签: python date pandas interpolation

我正在尝试在python pandas中的两个数据帧之间插入两个日期列。

我想将dfDrillTable中的" EVENT" 列" DrillDate"与最近的下一个出现日期结合起来dfCompTable。 dfDrillTable有一个" Drilldate"这将永远发生在之前 dfCompTable" OpenDate"。 dfDrillTable和dfCompTable 必须都加入" Name"但只有dfDrillTable有一个独特的" EVENT"我试图将两个数据帧链接起来。

在钻井表中有一些井名,在dfCompTable(和签证)中不存在。我需要这些仍然进入表格,但作为价值不存在的空白。

我创建了两个示例数据框供以下参考。然后是第三个显示我想要的结果。

我知道有多种方法可以使用outerjoins和this来实现这一点,但我只是想在两个日期之间寻找最干净,最简单的插值方法。

    #dfDrillTable

Name    EVENT   DrillDate
0   W1  E1  2000-01-01
1   W1  E2  2000-03-01
2   W2  E3  2000-04-01
3   W1  E4  2000-05-15
4   W2  E5  2000-01-10
5   W3  E6  2000-02-01
6   G1  E1  2000-02-02

    #dfCompTable
    Name    OpenDate
0   W1  2000-01-02
1   W1  2000-03-15
2   W1  2000-05-10
3   W1  2000-05-20
4   W2  2000-01-15
5   W3  2000-02-10
6   X1  2016-05-05


    #dfInterp Outcome


Name    EVENT   DrillDate   OpenDate
0   W1  E1  2000-01-01  2000-01-02
1   W1  E2  2000-03-01  2000-03-15
2   W1  E3  2000-04-01  2000-05-10
3   W1  E4  2000-05-15  2000-05-20
4   W2  E5  2000-01-10  2000-01-15
5   W3  E6  2000-02-01  2000-02-10
6   G1  E1  2000-01-10  NaT
7   X1      NaT 2016-05-05

这是创建表的代码

# Two DataTables
raw_data = {'Name': ['W1', 'W1', 'W2', 'W1', 'W2','W3','G1'],
            'EVENT':['E1', 'E2', 'E3', 'E4', 'E5','E6','E1'],
        'DrillDate': ['01/01/2000', '03/01/2000', '04/01/2000', '05/15/2000', '01/10/2000','02/01/2000','02/02/2000']}
dfDrillTable = pd.DataFrame(raw_data, columns = ['Name','EVENT','DrillDate'])
dfDrillTable['DrillDate'] = pd.to_datetime(dfDrillTable['DrillDate'])
dfDrillTable

raw_data2 = {'Name': ['W1', 'W1', 'W1', 'W1', 'W2','W3','X1'],
        'OpenDate': ['01/02/2000', '03/15/2000', '05/10/2000', '05/20/2000', '01/15/2000','02/10/2000','05/05/2016']}
dfCompTable = pd.DataFrame(raw_data2, columns = ['Name','OpenDate'])
dfCompTable['OpenDate'] = pd.to_datetime(dfCompTable['OpenDate'])
dfCompTable

结果:

# Hopefull Outcome
raw_data = {'Name': ['W1', 'W1', 'W1', 'W1', 'W2','W3','G1','X1'],
            'EVENT':['E1', 'E2', 'E3', 'E4', 'E5','E6','E1',''],
        'DrillDate': ['01/01/2000', '03/01/2000', '04/01/2000', '05/15/2000', '01/10/2000','02/01/2000','01/10/2000',''],
           'OpenDate': ['01/02/2000', '03/15/2000', '05/10/2000', '05/20/2000', '01/15/2000','02/10/2000','','05/05/2016']}
dfInterp = pd.DataFrame(raw_data, columns = ['Name','EVENT','DrillDate','OpenDate'])
dfInterp['DrillDate'] = pd.to_datetime(dfInterp['DrillDate'])
dfInterp['OpenDate'] = pd.to_datetime(dfInterp['OpenDate'])
dfInterp

1 个答案:

答案 0 :(得分:1)

让我们使用pd.merge_asof:< - 链接到文档

pd.merge_asof是版本0.19.0中的新功能确保安装了最新的pandas。

dfInterp = pd.merge_asof(dfCompTable.sort_values(by="OpenDate")
                         ,dfDrillTable.sort_values(by="DrillDate")
                         ,left_on="OpenDate",right_on="DrillDate")

dfInterp[['Name_x','EVENT','DrillDate','OpenDate']].sort_values(by='Name_x')

  Name_x EVENT  DrillDate   OpenDate
0     W1    E1 2000-01-01 2000-01-02
3     W1    E2 2000-03-01 2000-03-15
4     W1    E3 2000-04-01 2000-05-10
5     W1    E4 2000-05-15 2000-05-20
1     W2    E5 2000-01-10 2000-01-15
2     W3    E6 2000-02-01 2000-02-10