我制作了一个数据框。请参见下图。
我想添加显示前一天,一周,一个月的值的列。 我的预期输出将是 P1_day,P1_yesterday,P1_week,P1_lastweek,P1_month,P1_lastmonth 等。 帮助将不胜感激。
答案 0 :(得分:1)
我不是100%肯定我了解您对使用shift的厌恶,但考虑到您有一个像这样的数据框:
import pandas as pd
import numpy as np
original = pd.DataFrame(np.random.randint(0,100,size=(10, 3)), columns=["P1_day", "P1_week", "P1_month"])
您始终可以按列移动,例如:
original["P1_yesterday"] = original["P1_day"].shift()
或子集化您要移动,移动和重命名的所有列,然后将它们连接到原始数据帧,例如:
subset_shifted = original[["P1_day", "P1_week", "P1_month"]].shift()
subset_shifted.columns = ["P1_yesterday", "P1_lastweek", "P1_lastmonth"]
original = pd.concat([original, subset_shifted], axis = 1)
答案 1 :(得分:0)
除了使用shift
之外,您还可以使用dateutil库。
例如:
import pandas as pd
import dateutil.relativedelta as rd
df = pd.DataFrame({'Date':pd.datetime(2019,5,1),pd.datetime(2019,5,2),pd.datetime(2019,5,3)]})
df
Date
0 2019-05-01
1 2019-05-02
2 2019-05-03
然后使用dateutil
获取新日期
df['P1_yesterday'] = df['Date'].dt.date + rd.relativedelta(days=-1)
df['P1_lastweek'] = df['Date'].dt.date + rd.relativedelta(weeks=-1)
df['P1_lastmonth'] = df['Date'].dt.date + rd.relativedelta(months=-1)
df
Date P1_yesterday P1_lastweek P1_lastmonth
0 2019-05-01 2019-04-30 2019-04-24 2019-04-01
1 2019-05-02 2019-05-01 2019-04-25 2019-04-02
2 2019-05-03 2019-05-02 2019-04-26 2019-04-03
出于某种原因,我不得不采取额外的步骤将其转换为datetime列,也许有人可以修改代码以使其更简单
df.P1_lastweek = pd.to_datetime(df.P1_lastweek)
df.P1_yesterday = pd.to_datetime(df.P1_yesterday)
df.P1_lastmonth = pd.to_datetime(df.P1_lastmonth)
现在,您可以根据需要使用访问器来获取所需的编号。
df.P1_lastweek.dt.day
0 24
1 25
2 26
Name: P1_lastweek, dtype: int64