有进货表和出库表,进货表有进货的产品和批次及时间、数量,出库表有产品和出库时间和数量,要对出库的产品匹配对应的批次,需要满足先进先出的原则。
分类:Python
import pandas as pd # 创建进货表 DataFrame inventory_data = { '产品': ['A', 'A', 'A', 'B', 'B', 'B'], '批次': ['B1', 'B2', 'B3', 'C1', 'C2', 'C3'], '时间': ['2023-01-01', '2023-02-01', '2023-03-01', '2023-01-01', '2023-02-01', '2023-03-01'], '数量': [100, 150, 200, 50, 100, 150] } inventory = pd.DataFrame(inventory_data) print(inventory) # 创建出库表 DataFrame sales_data = { '产品': ['A', 'B', 'B'], '出库时间': ['2023-04-01', '2023-03-15', '2023-04-05'], '出库数量': [120, 80, 100] } sales = pd.DataFrame(sales_data) # 根据产品、时间和批次对进货表进行排序 inventory = inventory.sort_values(['产品', '时间', '批次']) # 创建一个空的 DataFrame 用于存储匹配结果 matching_results = pd.DataFrame(columns=['产品', '批次', '出库时间', '出库数量']) # 遍历出库表中的每一行 for index, sale in sales.iterrows(): product = sale['产品'] sale_time = sale['出库时间'] sale_quantity = sale['出库数量'] # 在进货表中根据产品找到足够数量的批次 matching_batches = inventory[(inventory['产品'] == product) & (inventory['数量'] > 0)] # 遍历批次,按先进先出原则匹配数量 for _, batch in matching_batches.iterrows(): batch_quantity = batch['数量'] if sale_quantity > batch_quantity: matching_results = matching_results.append( {'产品': product, '批次': batch['批次'], '出库时间': sale_time, '出库数量': batch_quantity}, ignore_index=True) inventory.loc[(inventory['产品'] == product) & (inventory['批次'] == batch['批次']), '数量'] = 0 sale_quantity -= batch_quantity else: matching_results = matching_results.append( {'产品': product, '批次': batch['批次'], '出库时间': sale_time, '出库数量': sale_quantity}, ignore_index=True) inventory.loc[ (inventory['产品'] == product) & (inventory['批次'] == batch['批次']), '数量'] -= sale_quantity break # 输出匹配结果 print(sales) print(matching_results) 结果 需要注意的是,需要确保原始数据的时间逻辑是没问题的。也就是先有库存再有销售。这个可以通过对比时间节点的累计库存和累计销售来核查。