【问题标题】:Merging Datetime Indices With Slightly Different Dates in Python在 Python 中将日期时间索引与稍微不同的日期合并
【发布时间】:2019-10-12 18:38:41
【问题描述】:

我正在尝试合并两个具有不同日期时间索引的 pandas 数据框。 DF1 是 XYZ 公司的季度财务报表,DF2 是 XYZ 股票公开交易股票的每日收盘价

问题在于财务报告的发布日期并不总是与当前的每日收盘价配对(可能是因为该报告是在周末发布的)。

我需要一种方法来模糊 DF2 中的日期,这样当我将它们与 DF1 合并时,合并会从 DF2 中选择最接近的日期,而不是在合并中为收盘价留下空白。

目前使用:

df1 = [['2007-12-30','$xxx,xxx'],
       ['2008-03-30','$xxx,xxx'],
       ['2008-06-28','$xxx,xxx'],
       ['2008-09-29','$xxx,xxx'],
       ['2008-12-31','$xxx,xxx']]

df2 = [['2007-12-30','$45'],
       ['2008-03-30','$40'],
       ['2008-06-27','$38'],
       ['2008-09-29','$46'],
       ['2008-12-30','$50']]

df3 = pd.merge(df1, df2, how='outer', on='date') 

返回:

df3 = [['2007-12-30','$xxx,xxx', '$45'],
       ['2008-03-30','$xxx,xxx', '$40'],
       ['2008-06-28','$xxx,xxx', 'NaN'],
       ['2008-09-29','$xxx,xxx', '$46'],
       ['2008-12-31','$xxx,xxx', 'Nan']]

希望它返回:

df3 = [['2007-12-30','$xxx,xxx', '$45'],
       ['2008-03-30','$xxx,xxx', '$40'],
       ['2008-06-28','$xxx,xxx', '$38'],
       ['2008-09-29','$xxx,xxx', '$46'],
       ['2008-12-31','$xxx,xxx', '$50']]

解决方案:

df3 = pd.merge(df1, df2, how='outer', on='date')\ 
        .sort_index(ascending=False).fillna(method="ffill")

df3 = df3[df3.index.isin(df1.index)]

【问题讨论】:

    标签: python pandas datetime-format


    【解决方案1】:

    使用fillna(method="ffill") 获取先前的值,然后仅保存日期在 df1 中存在的行

    df3 = pd.merge(df1, df2, how='outer', on='date').sort_values('date').fillna(method="ffill")
    df3 = df3[df3['date'].isin(df1['date'])]
             date    xprice price
    0  2007-12-30  $xxx,xxx   $45
    1  2008-03-30  $xxx,xxx   $40
    2  2008-06-28  $xxx,xxx   $38
    3  2008-09-29  $xxx,xxx   $46
    4  2008-12-31  $xxx,xxx   $50
    

    【讨论】:

    • 我可能执行错了,但我认为 fillna 不会起作用。 DF2 具有一年中每一天的收盘价,因此值比 df1 多得多。当我使用 fillna 时,它会从 DF2 中最后一次匹配 DF1 的日期开始计算收盘价,这将使收盘价下降 3 个月。
    • 据我所知,如果 fillna 从上一行获取,并且在合并后使用排序会导致获得上一个可用日期
    • 我在我的问题中添加了一个表格,以便您查看价格差异。
    • 是的。我最初在 sort_values 上抛出了一个错误,但这是因为我已经将日期设置为 df1 df2 中的索引。我将在问题中发布更改。谢谢!
    【解决方案2】:
    import pandas as pd
    
    mylist1 = [['2007-12-30','$xxx,xxx'],
           ['2008-03-30','$xxx,xxx'],
           ['2008-06-28','$xxx,xxx'],
           ['2008-09-29','$xxx,xxx'],
           ['2008-12-31','$xxx,xxx']]
    
    
    mylist2 = [['2007-12-30','$45'],
           ['2008-03-30','$40'],
           ['2008-06-27','$38'],
           ['2008-09-29','$46'],
           ['2008-12-30','$50']]
    
    df1 = pd.DataFrame.from_records(mylist1,columns=['date', "value"])
    df2 = pd.DataFrame.from_records(mylist2,columns=['date', "value"])
    df3 = pd.merge(df1, df2, right_index=True, left_index=True) 
    

    【讨论】:

      猜你喜欢
      • 2021-11-23
      • 2020-01-27
      • 2019-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-13
      相关资源
      最近更新 更多