首页 > 解决方案 > 如何为时间序列数据框添加行?

问题描述

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

店铺 开业月份 状态 城市 月底日期 销售量
AAA 2020 年 5 月 31 日 纽约 纽约 2020 年 5 月 31 日 1000
AAA 2020 年 5 月 31 日 纽约 纽约 2020 年 6 月 30 日 5000
AAA 2020 年 5 月 31 日 纽约 纽约 2020 年 7 月 30 日 3000
AAA 2020 年 5 月 31 日 纽约 纽约 2020 年 8 月 31 日 4000
AAA 2020 年 5 月 31 日 纽约 纽约 2020 年 9 月 30 日 2000
BBB 2020 年 6 月 30 日 电脑断层扫描 哈特福德 2020 年 6 月 30 日 100
BBB 2020 年 6 月 30 日 电脑断层扫描 哈特福德 2020 年 7 月 30 日 200

因此,对于这样的任何情况,我希望能够为 8/31 和 9/30 的 Store BBB 添加两行。新行应使用与最近月末日期相同的“开业月份”、“州”和“城市”。两个新行的销售额都应设置为 0。截至目前,我执行以下步骤:

  1. 使用商店名称和每个商店的最大月末日期以及整个时间序列数据框的最大月末日期创建数据框“MaxDateData”,我将此字段命名为“最近日期”。
店铺 最大月结束日期 最近日期
AAA 2020 年 9 月 30 日 2020 年 9 月 30 日
BBB 2020 年 7 月 30 日 2020 年 9 月 30 日
  1. 使用主要时间序列数据框中的最新行创建数据框“MostRecent”。为此,我在时间序列数据框和商店名称和最大月结束日期上的 MaxDateData 之间进行内部连接。
店铺 开业月份 状态 城市 月底日期 销售量 最大月结束日期 最近日期
AAA 2020 年 5 月 31 日 纽约 纽约 2020 年 9 月 30 日 2000 2020 年 9 月 30 日 2020 年 9 月 30 日
BBB 2020 年 6 月 30 日 电脑断层扫描 哈特福德 2020 年 7 月 30 日 200 2020 年 7 月 30 日 2020 年 9 月 30 日
  1. 使用 where 子句创建数据框“RequireBackfill_MostRecent”,以过滤 Max Month End Date < 最近日期的商店。请参阅下面的代码。所以在这个例子中,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')
  1. 然后,我使用两个嵌套的 for 循环来循环遍历需要填写的日期。它利用仅包含 Store BBB 的 RequireBackfill_MostRecent 数据框。
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) 
  1. 然后我使用 concat 将 NewData 添加到我的时间序列数据框中
FullData_List = [MonthlyData,NewData]
FullData=pd.concat(FullData_List)

整个过程有效,但有没有更有效的方法来做到这一点?当我开始处理更大的数据时,这可能会变得很昂贵。

标签: pythonpandasdataframe

解决方案


  1. 只需尝试upsampleDateTime 索引。参考: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()
  1. 请注意:7/30/2020不是七月的结束日。7/31/2020是。所以使用这种方法7/30/2020将是一个问题(将月底日期转换为真正的结束日期)。

推荐阅读