【发布时间】:2018-09-12 11:50:33
【问题描述】:
我有 3 个dataframes 已经按日期和p_id 排序,没有null 值如下:
第一个数据帧
df1 = pd.DataFrame([['2018-07-05',8.0,1],
['2018-07-15',1.0,1],
['2018-08-05',2.0,1],
['2018-08-05',2.0,2]],
columns=["purchase_date", "qty", "p_id"])
第二个数据帧
df2 = pd.DataFrame([['2018-07-15',2.0,1],
['2018-08-04',7.0,1],
['2018-08-15',1.0,2]],
columns=["sell_date", "qty", "p_id"])
第三个数据帧
df3 = pd.DataFrame([['2018-07-25',1.0,1],
['2018-08-15',1.0,1]],
columns=["expired_date", "qty", "p_id"])
dataframe 看起来像:
1st:(持有购买详情)
purchase_date qty p_id
0 2018-07-05 8.0 1
1 2018-07-15 1.0 1
2 2018-08-05 2.0 1
3 2018-08-05 2.0 2
第二个:(持有销售详情)
sell_date qty p_id
0 2018-07-15 2.0 1
1 2018-08-04 7.0 1
2 2018-08-15 1.0 2
3rd:(持有到期详情)
expired_date qty p_id
0 2018-07-25 1.0 1
1 2018-08-15 1.0 1
现在我要做的是找到购买过期产品的时间
按照FIFO(先购买的产品先过期)
说明:考虑 id 为 1 的产品
截至日期 2018-07-15
我们有8+1个购买数量和-2个销售数量,即总共有8+1-2个库存数量,-ve表示减量
截至日期 2018-07-25
1 个数量已过期,因此我们新的 when_product_expired dataframe 的第一个条目将是:
purchase_date expired_date p_id
2018-07-05 2018-07-25 1
然后为下一个到期条目
截至日期 2018-08-04
7 数量已售罄,因此当前数量为 8+1-2-7 = 0
截至日期 2018-08-05
购买了 2 个数量,因此当前数量为 0+2
截至日期 2018-08-15
1 个数量已过期
所以一个新的和最终的条目将是:
purchase_date expired_date p_id
2018-07-05 2018-07-25 1
2018-08-05 2018-08-15 1
这次过期的产品是2018-07-25购买的
其实我有日期时间,所以购买和销售时间永远不会相等(您可以假设),同样在销售和到期之前,总会有一定数量的产品库存,即数据是一致的
并提前谢谢你:-)
更新
现在我在想的是将所有日期字段重命名为相同的字段名称,并用负号附加购买、销售、过期dataframe,但这对我没有帮助
df2.qty = df2.qty*-1
df3.qty=df3.qty*-1
new = pd.concat([df1,df2, df3],sort=False)
.sort_values(by=["purchase_date"],ascending=True)
.reset_index(drop=True)
【问题讨论】:
-
我也愿意使用 Pandas 以外的其他工具,我在一些关系数据库中有这些数据
-
数量也可以是分数