python - 如何为时间序列数据框添加行?
问题描述
我正在编写一个程序,它将时间序列 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。截至目前,我执行以下步骤:
- 使用商店名称和每个商店的最大月末日期以及整个时间序列数据框的最大月末日期创建数据框“MaxDateData”,我将此字段命名为“最近日期”。
店铺 | 最大月结束日期 | 最近日期 |
---|---|---|
AAA | 2020 年 9 月 30 日 | 2020 年 9 月 30 日 |
BBB | 2020 年 7 月 30 日 | 2020 年 9 月 30 日 |
- 使用主要时间序列数据框中的最新行创建数据框“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 日 |
- 使用 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')
- 然后,我使用两个嵌套的 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)
- 然后我使用 concat 将 NewData 添加到我的时间序列数据框中
FullData_List = [MonthlyData,NewData]
FullData=pd.concat(FullData_List)
整个过程有效,但有没有更有效的方法来做到这一点?当我开始处理更大的数据时,这可能会变得很昂贵。
解决方案
- 只需尝试
upsample
DateTime 索引。参考: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
将是一个问题(将月底日期转换为真正的结束日期)。
推荐阅读
- javascript - jsGrid中的自动调整大小的列
- asp.net-mvc-5 - 将多个类添加到购物车类.net mvc 5
- excel - 根据单元格颜色vba剪切整行
- stripe-payments - 自定义条带结帐的客户端错误处理
- c# - 带有 DATEADD() 逻辑的 LINQ 查询的 SELECT 语句中的 IF ELSE 条件
- node.js - 如果对象为空,猫鼬不保存
- angularjs - 同时为 Web 和桌面应用程序执行自动化测试
- azure - 当我尝试使用 Microsoft 集成运行时从 Azure 连接本地 IBM DB2 时出现错误
- c# - 第二次 onCommand 事件后 FormView 丢失数据
- windows - win10上ddev nfs挂载失败