【问题标题】:Pandas merge operation for nearest date variation + / - 3 days熊猫最近日期变化的合并操作 + / - 3 天
【发布时间】:2020-08-07 11:10:43
【问题描述】:

我有 2 个交易数据框:

左:

        code        debit       credit         reference        payment date

    1   112133      6,31,964.51 0           MH20181000022319    18.09.2018      
    2   112133      6,29,161.51 0           MH20181000022340    12.09.2018      
    3   112133      2,78,288.51 0           MH20181000022341    27.10.2018      
    4   112133      0           3,13,599.51 MH20181000022502    13.11.2018      
    5   112133      3,16,683.00 0           MH20181000022503    22.07.2018      
    6   112133      3,27,332.00 0           MH20181000022504    02.12.2018  

正确:-

        code        DR          CR          reference          trans date

    1   112133      7,37,964.51 0           345                 24.09.2018      
    2   112133      0           6,31,964.51 456                 20.09.2018      
    3   112133      1,23,434.00 0           567                 13.05.2018      
    4   112133      3,13,599.51 0           420                 09.03.2018      
    5   112133      0           3,16,683.00 890                 19.01.2018      
    6   112133      3,27,332.00 0           123                 19.01.2018

我想使用pandas merge / merge_asof on 执行join操作:

左栏 = ['借方', '付款日期']

右栏 = ['credit', 'trans date']

问题是付款日期并非每次都完全匹配,因此我需要考虑从左行到右行的给定日期的 + / - 3 天的变化。

因此,结果应该理想地匹配左 1 行和右 2 行。

我开始参考merge_asof & merge_ordered,请建议?

那会很有帮助。

【问题讨论】:

  • 我提到了TimeDelta,它解决了我50%的问题,因为merge_asof只支持单列连接,请建议如何在merge_asof中使用多列?

标签: python pandas dataframe join merge


【解决方案1】:

使用连续序列(非分类)时。可以使用的一种技术是使用pd.cut() 将其转换为分类。

  1. leftright 计算开始和结束日期。将 bins 构造为每 6 天(几乎相当于 +/- 3 天)
  2. assign() 一个新列 datebinleftright 这是分类日期
  3. join 上的值和 datebin

大部分代码只是解析您粘贴在问题中的文本。

data = """idx        code        debit       credit         reference        payment date
    1   112133      6,31,964.51  0           MH20181000022319    18.09.2018      
    2   112133      6,29,161.51  0           MH20181000022340    12.09.2018      
    3   112133      2,78,288.51  0           MH20181000022341    27.10.2018      
    4   112133      0           3,13,599.51  MH20181000022502    13.11.2018      
    5   112133      3,16,683.00  0           MH20181000022503    22.07.2018      
    6   112133      3,27,332.00  0           MH20181000022504    02.12.2018  """

a = [[t.strip().replace(",", "") for t in re.split("  ",l) if t!=""]  for l in [re.sub("([0-9]+[ ])*(.*)", r"\2", l) for l in data.split("\n")]]
df1 = pd.DataFrame(a[1:], columns=a[0]).drop("idx", axis=1)
df1["payment date"] = pd.to_datetime(df1["payment date"])
data = """idx        code        DR          CR          reference          trans date
    1   112133      7,37,964.51  0           345                 24.09.2018      
    2   112133      0           6,31,964.51  456                 20.09.2018      
    3   112133      1,23,434.00  0           567                 13.05.2018      
    4   112133      3,13,599.51  0           420                 09.03.2018      
    5   112133      0           3,16,683.00  890                 19.01.2018      
    6   112133      3,27,332.00  0           123                 19.01.2018"""
a = [[t.strip().replace(",", "") for t in re.split("  ",l) if t!=""]  for l in [re.sub("([0-9]+[ ])*(.*)", r"\2", l) for l in data.split("\n")]]

df2 = pd.DataFrame(a[1:], columns=a[0]).drop("idx", axis=1)
df2["trans date"] = pd.to_datetime(df2["trans date"])

# NB previous pd.to_datetime()
# get min and max dates from both dataframes, then create a series of bins for every 6 days
# approximates to +/- 3 days
bins = pd.date_range(min(df1["payment date"].min(), df2["trans date"].min()), 
              max(df1["payment date"].max(), df2["trans date"].max()), freq="6D")


dfm = df1.assign(datebin=pd.cut(df1["payment date"], bins=bins))\
    .merge(df2.assign(datebin=pd.cut(df2["trans date"], bins=bins)), 
           left_on=["debit","datebin"], right_on=["CR","datebin"])

输出

 code_x      debit credit       reference_x payment date                   datebin  code_y DR         CR reference_y trans date
 112133  631964.51      0  MH20181000022319   2018-09-18  (2018-09-16, 2018-09-22]  112133  0  631964.51         456 2018-09-20

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-13
    • 1970-01-01
    • 2021-02-10
    • 2017-09-15
    相关资源
    最近更新 更多