[英]How to populate a dataframe using Date, Month and Year and manipulate that dataframe?
我想使用 pandas 或 python 创建一个新表,该表将具有与图片相同的列,但我想在新表中添加实际表的两个日期之间的所有日期。
例如在第一行的图片中,生效日期是 2022 年 2 月 13 日,价格是 220,第二行的生效日期是 2021 年 9 月 23 日。
我希望在新表中包含 2022 年 2 月 13 日至 2021 年 9 月 23 日之间的所有日期。除 MRP/Unit 外,所有其他列的值都相同。
在 2022 年 2 月 13 日到 2021 年 8 月 23 日期间,MRP/Unit 中的所有值都将为 220。在 2021 年 9 月 23 日到 2019 年 9 月 9 日之间,MRP/Unit 中的所有值都将为 210。
在这里,我跳过了应该将日期字符串转换为日期对象的部分。 你可以在这个答案中检查你
将您的数据框视为initial_df
:
initial_df = pd.DataFrame({'Weight':[215.235,215.235,215.235,215.235],
'Effect Date':[date(2022,2,13),date(2021,9,23),date(2019,10,9),date(2019,7,14)],
'MRP/Unit(Tk)':[220,210,200,190]})
Weight Effect Date MRP/Unit(Tk)
0 215.235 2022-02-13 220
1 215.235 2021-09-23 210
2 215.235 2019-10-09 200
3 215.235 2019-07-14 190
首先,您应该在“生效Effect Date
”列中提取第一个和最后一个日期。
start_date = initial_df['Effect Date'].min()
end_date = initial_df['Effect Date'].max()
现在您可以使用pd.date_range
方法在 pandas 中创建日期范围。
date_index = pd.date_range(start_date,end_date)
其次,您可以使用此日期范围作为索引创建一个新数据框,并将其与您的initial_df
左连接以获取其他行。 由于第一个数据框只有一个索引列,因此另一个应该将连接键( Effect Date
)设置为它的索引。
result_df = pd.DataFrame(index=date_index)\
.join(initial_df.set_index('Effect Date'),
how='left')
Weight MRP/Unit(Tk)
2019-07-14 215.235 190.0
2019-07-15 NaN NaN
2019-07-16 NaN NaN
2019-07-17 NaN NaN
2019-07-18 NaN NaN
... ... ...
2022-02-09 NaN NaN
2022-02-10 NaN NaN
2022-02-11 NaN NaN
2022-02-12 NaN NaN
2022-02-13 215.235 220.0
现在我们可以使用 pandas 的fillna
方法的backfill或forwardfill策略填充其他列中的NaN
值。 这种方法也可以在单列上完成。
result_df.fillna(method='bfill')
Weight MRP/Unit(Tk)
2019-07-14 215.235 190.0
2019-07-15 215.235 200.0
2019-07-16 215.235 200.0
2019-07-17 215.235 200.0
2019-07-18 215.235 200.0
... ... ...
2022-02-09 215.235 220.0
2022-02-10 215.235 220.0
2022-02-11 215.235 220.0
2022-02-12 215.235 220.0
2022-02-13 215.235 220.0
如果您希望MRP/Unit(Tk)
值在某个日期前一个月发生变化,则应使用反向填充值填充另一列。 在您的initial_df
中复制Effect Date
列。 然后也将反向填充应用于result_df
中的该列。 然后,您可以决定在结果数据框中需要哪个值,知道该日期之后的下一个日期以及initial_df
中的以下MRP/Unit值。
.shift(-1)
方法获取下一行中的日期。pd.date_range
在每一行中创建当前日期和下一个日期之间的日期列表.explode()
df = pd.DataFrame({
'date': ['09/25/2021','09/27/2021','09/30/2021'],
'value': [1,2,3]
})
df['date'] = pd.to_datetime(df['date'])
df['next_date'] = df['date'].shift(-1)
df['next_date'] = df['next_date'].fillna(df['date'])
df['list_of_date_between'] = df.apply(lambda row: pd.date_range(row['date'], row['next_date'], freq='D').tolist()[:-1], axis=1)
df = df.explode('list_of_date_between')
df['list_of_date_between'] = df['list_of_date_between'].fillna(df['date'])
df = df[['list_of_date_between', 'value']]
df = df.rename({'list_of_date_between': 'date'}, axis=1)
print (df.to_markdown(index=False))
输出
日期 | 价值 |
---|---|
2021-09-25 00:00:00 | 1 |
2021-09-26 00:00:00 | 1 |
2021-09-27 00:00:00 | 2 |
2021-09-28 00:00:00 | 2 |
2021-09-29 00:00:00 | 2 |
2021-09-30 00:00:00 | 3 |
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.