繁体   English   中英

如何使用日期、月份和年份填充数据框并操作该数据框?

[英]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方法的backfillforwardfill策略填充其他列中的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM