python - 如何为时间序列数据帧添加行?

标签 python pandas dataframe

我正在编写一个程序,该程序会将时间序列 excel 文件加载到数据框中,然后使用一些基本计算创建几个新列。我的程序有时会读取某些记录丢失数月的 excel 文件。所以在下面的例子中,我有两个不同商店的每月销售数据。商店在不同的月份开放,因此它们的第一个月底日期会有所不同。但两者都应该有截至 2020 年 9 月 30 日的月末数据。在我的文件中,Store BBB 没有 8/31/2020 和 9/30/2020 的记录,因为那几个月没有销售。


店铺
开业月份
状态
城市
月底日期
销售量


AAA
5/31/2020
纽约
纽约
5/31/2020
1000

AAA
5/31/2020
纽约
纽约
6/30/2020
5000

AAA
5/31/2020
纽约
纽约
7/30/2020
3000

AAA
5/31/2020
纽约
纽约
8/31/2020
4000

AAA
5/31/2020
纽约
纽约
2020/9/30
2000年

BBB
6/30/2020
计算机断层扫描
哈特福德
6/30/2020
100

BBB
6/30/2020
计算机断层扫描
哈特福德
7/30/2020
200


因此,对于这样的任何实例,我希望能够为 8/31 和 9/30 的 Store BBB 添加两行。新行应使用与最近月末日期相同的 Month Opened、State 和 City。两个新行的销售额都应设置为 0。截至目前,我执行以下步骤:

  • 使用商店名称和每个商店的最大月末日期以及整个时间序列数据框的最大月末日期创建数据框“MaxDateData”,我将此字段命名为“最近日期”。



  • 店铺
    最大月结束日期
    最近的日期


    AAA
    2020/9/30
    2020/9/30

    BBB
    7/30/2020
    2020/9/30


  • 使用主时间序列数据帧中的最新行创建数据帧“MostRecent”。为此,我在时间序列数据帧和 Store Name 和 Max Month End Date 上的 MaxDateData 之间进行了内部连接。



  • 店铺
    开业月份
    状态
    城市
    月底日期
    销售量
    最大月结束日期
    最近的日期


    AAA
    5/31/2020
    纽约
    纽约
    2020/9/30
    2000年
    2020/9/30
    2020/9/30

    BBB
    6/30/2020
    计算机断层扫描
    哈特福德
    7/30/2020
    200
    7/30/2020
    2020/9/30


  • 使用 where 子句创建数据框“RequireBackfill_MostRecent”以过滤最大月结束日期 < 最近日期的商店。请参阅下面的代码。因此,在此示例中,RequireBackfill_MostRecent 表将只有一行用于存储 BBB。
  • RequireBackfill_Stores_MostRecent = MaxDateData.where(MaxDateData['Max Month End Date'] <MaxDateData['Most Recent Date'])
    RequireBackfill_MostRecent = MostRecent.merge(RequireBackfill_Stores_MostRecent,how='inner')
    
  • 然后我使用两个嵌套的 for 循环来循环我需要填写的日期。它利用 RequireBackfill_MostRecent 数据框,它只包含 Store BBB。
  • X=[]
    end = MaxDateData['Most Recent Date'][0]
    for i in MonthlyData['Month End Date'].unique():
        per1 = pd.date_range(start = i,  end = end, freq ='M') 
        for val in per1: 
            Data=[]
            Data = RequireBackfill_MostRecent[["Store"
                                               ,"Month Opened"
                                               ,"City"
                                               ,"State"
                                               ]].where(RequireBackfill_MostRecent['Max Month End date']==i).dropna()   
    
            Data["Month End Date"]= val                
            Data["Sales"]= 0
            X.append(Data)
    NewData = pd.concat(X) 
    
  • 然后我使用 concat
  • 将 NewData 添加到我的时间序列数据框中
    FullData_List = [MonthlyData,NewData]
    FullData=pd.concat(FullData_List)
    
    整个过程有效,但有没有更有效的方法来做到这一点?当我开始处理更大的数据时,这可能会变得昂贵。

    最佳答案

  • 试试看 upsample日期时间索引。引用:pandas-resample-upsample-last-date-edge-of-data
  • # group by `Store`
    # with `Month End Date` column show be converted to DateTime
    
    group.set_index(['Month End Date']).resample('M').asfreq()
    
  • 请注意:7/30/2020不是七月的结束日。 7/31/2020是。所以使用这种方法7/30/2020将是一个问题(将月结束日期转换为真正的结束日期)。
  • 关于python - 如何为时间序列数据帧添加行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65516535/

    相关文章:

    python - Numpy:ImportError:无法导入名称 TestCase

    python - 创建列 : sql datatypes from a SQLAlchemy Model? 的字典

    python - Pandas 连接多行文本

    python - Pandas 数据帧 : how to summarize columns containing value

    python - numpy中的元素级字符串连接

    python - Django正则表达式匹配长url

    python - Django ManyToMany 关系无法访问字段

    python - 将嵌套的坐标列表转换为形状多边形

    python - Pandas corr() 与 corrwith()

    python - 选择两个日期之间的 Pandas 数据框行