我有以下示例输入数据,每季度更新一次。我想将此季度数据添加到上一季度表中,如输出中所示。我试过很多方法,但没能找到正确的方法。
输入DF:
FIRST
2007Q1
2007Q1
2007Q1
2007Q2
2007Q2
2007Q2
2007Q3
2007Q3
2007Q3
2007Q4
2007Q4
2007Q4
2008Q1
2008Q1
2008Q1
输出:
First Last
2007Q1 2006Q4
2007Q1 2006Q4
2007Q1 2006Q4
2007Q2 2007Q1
2007Q2 2007Q1
2007Q2 2007Q1
2007Q3 2007Q2
2007Q3 2007Q2
2007Q3 2007Q2
2007Q4 2007Q3
2007Q4 2007Q3
2007Q4 2007Q3
2008Q1 2007Q4
2008Q1 2007Q4
2008Q1 2007Q4
有人可以帮我解决这个问题吗?我需要这个来进行进一步的分析。谢谢!
答案 0 :(得分:3)
如果您的列是字符串,请将其转换为Period
对象:
df['FIRST'] = pd.PeriodIndex(df.FIRST, freq='Q')
接下来,使用pd.PeriodIndex.shift
:
df['LAST'] = df['FIRST'].shift(-1)
df
FIRST LAST
0 2007Q1 2006Q4
1 2007Q1 2006Q4
2 2007Q1 2006Q4
3 2007Q2 2007Q1
4 2007Q2 2007Q1
5 2007Q2 2007Q1
6 2007Q3 2007Q2
7 2007Q3 2007Q2
8 2007Q3 2007Q2
9 2007Q4 2007Q3
10 2007Q4 2007Q3
11 2007Q4 2007Q3
12 2008Q1 2007Q4
13 2008Q1 2007Q4
14 2008Q1 2007Q4
答案 1 :(得分:2)
如果你想要它作为一个单行:
df['LAST'] = pd.PeriodIndex(pd.to_datetime(df['FIRST']) - pd.DateOffset(months=3),freq='Q')
答案 2 :(得分:1)
您可以编写自定义函数来执行此操作:
def last_q(c):
sp = c.split("Q")
yr = sp[0]
q = sp[1]
if int(q) > 1:
return "Q".join([yr,str(int(q)-1)])
else:
return "Q".join([str(int(yr)-1),"4"])
例如:
>a = pd.Series(["2017Q1", "2016Q4"])
>a
0 2017Q1
1 2016Q4
dtype: object
>a.apply(last_q)
0 2016Q4
1 2016Q3
dtype: object