我的初始資料集只有 2 列,日期和值。
我想要做的是,對于每個日期,獲取上個月的值(列 m-1 和 m-12)。我遇到的問題是上個月不存在這一天,比如 2 月 29 日,我想將其留空,并且大多數方法傾向于獲取附近的日期。
因此,決賽桌將是這樣的:
| 日期 | 價值 | 米-1 | 米-12 |
|---|---|---|---|
| 2021-01-05 | 400 | 鈉 | 鈉 |
| 2022-01-05 | 100 | 鈉 | 400 |
| 2022-01-28 | 300 | 鈉 | 鈉 |
| 2022-02-05 | 300 | 100 | 鈉 |
| 2022-02-28 | 500 | 300 | 鈉 |
| 2022-03-29 | 300 | 鈉 | 鈉 |
我在想我可以使用類似的東西,d.apply(lambda x: x['date'] - relativedelta(months = 1), axis=1)但是有了這個,我只得到日期,而不是價值。它對日期進行四舍五入,例如對于 2022-03-29,它回傳 2022-02-28,這是不正確的,它應該是 02-29,并且由于它不存在它應該是 NaN。
uj5u.com熱心網友回復:
這是一個可能性:
# 1. necessary imports
import pandas as pd
from dateutil.relativedelta import relativedelta
import numpy as np
# 2. build example
df_example = pd.DataFrame(columns=["date", "value"])
df_example.date = ["2021-01-05", "2022-01-05", "2022-01-28", "2022-02-05", "2022-02-28", "2022-03-29"]
df_example.date = pd.to_datetime(df_example.date)
df_example.value = [400, 100, 300, 300, 500, 300]
# 3. look for the value corresponding to a given date
def build_column(row, month_shift, year_shift):
previous_month_date = f"{row.date.year-year_shift}-{row.date.month-month_shift}-{row.date.day}"
previous_value_row = df_example[df_example.date == previous_month_date]
if len(previous_value_row) == 0:
return np.nan
return previous_value_row.value.iloc[0]
# 4. add column m1 corresponding to the 1-month shift
df_example["m1"] = df_example.apply(lambda x: build_column(x, 1, 0), axis=1)
df_example["m12"] = df_example.apply(lambda x: build_column(x, 0, 1), axis=1)
哪個輸出
| 日期 | 價值 | 米1 | m12 | |
|---|---|---|---|---|
| 0 | 2021-01-05 00:00:00 | 400 | 楠 | 楠 |
| 1 | 2022-01-05 00:00:00 | 100 | 楠 | 400 |
| 2 | 2022-01-28 00:00:00 | 300 | 楠 | 楠 |
| 3 | 2022-02-05 00:00:00 | 300 | 100 | 楠 |
| 4 | 2022-02-28 00:00:00 | 500 | 300 | 楠 |
| 5 | 2022-03-29 00:00:00 | 300 | 楠 | 楠 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/454548.html
