在python中将年/季度日期格式更改为上一个期间

在python中将年/季度日期格式更改为上一个期间,python,pandas,date,Python,Pandas,Date,我有一个数据集,其中包含一个时间序列的每月观测值。 我要做的是将datetime转换为年/季度格式,然后将第一个值DATE[0]提取为上一个季度。例如,2006-10-31属于2006年第四季度。但我想把它改成2006Q3。 对于后续值的提取,我将只使用每个季度的最后一个值。 因此,对于2006年第4季度,我将只保留日期[2]中的BBGN、SSD和QQ4567值。同样,对于2007年第一季度,我将只保留DATE[5]值,以此类推 原始数据集: DATE

我有一个数据集,其中包含一个时间序列的每月观测值。 我要做的是将datetime转换为年/季度格式,然后将第一个值
DATE[0]
提取为上一个季度。例如,2006-10-31属于2006年第四季度。但我想把它改成2006Q3。 对于后续值的提取,我将只使用每个季度的最后一个值。 因此,对于2006年第4季度,我将只保留
日期[2]
中的BBGN、SSD和QQ4567值。同样,对于2007年第一季度,我将只保留
DATE[5]
值,以此类推

原始数据集:

               DATE                BBGN    SSD             QQ4567  
    0  2006-10-31 00:00:00        1.210  22.022          9726.550   
    1  2006-11-30 00:00:00        1.270  22.060          9891.008   
    2  2006-12-31 00:00:00        1.300  22.080         10055.466   
    3  2007-01-31 00:00:00        1.330  22.099         10219.924   
    4  2007-02-28 00:00:00        1.393  22.110         10350.406
    5  2007-03-31 00:00:00        1.440  22.125         10480.888 
在处理日期之后

       DATE          BBGN    SSD             QQ4567  
    0  2006Q3        1.210  22.022          9726.550   
    2  2006Q4        1.300  22.080         10055.466   
    5  2007Q1        1.440  22.125         10480.888 
到目前为止,我采取的步骤是:

将值从yyyy-mm-dd-hh格式转换为yyyyQQ格式

DF['DATE'] = pd.to_datetime(DF['DATE']).dt.to_period('Q')
我明白了

    DATE          BBGN    SSD             QQ4567  
0  2006Q4        1.210  22.022          9726.550   
1  2006Q4        1.270  22.060          9891.008   
2  2006Q4        1.300  22.080         10055.466   
3  2007Q1        1.330  22.099         10219.924   
4  2007Q1        1.393  22.110         10350.406
5  2007Q1        1.440  22.125         10480.888
下一步是从每个季度提取最后的值。但是因为我总是想保留第一行,所以我将从函数中排除
DATE[0]

quarterDF = DF.iloc[1:,].drop_duplicates(subset='DATE', keep='last')

现在,我的问题是如何将
DATE[0]
中的值更改为始终为上一季度的值。所以,从2006年第四季度到2006年第三季度。另外,如果
日期[0]
是2007年第一季度,我可以将其更改为2006年第四季度吗?

我的建议是创建一个新的
日期列,其中日期为过去3个月的日期。像这样

import pandas as pd
df = pd.DataFrame()
df['Date'] = pd.to_datetime(['2006-10-31', '2007-01-31'])
one_quarter = pd.tseries.offsets.DateOffset(months=3)
df['Last_quarter'] = df.Date - one_quarter
这会给你

    Date    Last_quarter
0   2006-10-31  2006-07-31
1   2007-01-31  2006-10-31

然后,您可以执行与上一季度所述相同的过程,这里是一个透视表方法

# Subtract the quarter from date save it in a column 
df['Q'] = df['DATE'] - pd.tseries.offsets.QuarterEnd()

#0   2006-09-30
#1   2006-09-30
#2   2006-09-30
#3   2006-12-31
#4   2006-12-31
#5   2006-12-31
#Name: Q, dtype: datetime64[ns]

# Drop and pivot for not including the columns 
ndf = df.drop(['DATE','Q'],1).pivot_table(index=pd.to_datetime(df['Q']).dt.to_period('Q'),aggfunc='last')

      BBGN     QQ4567     SSD
Qdate                          
2006Q3  1.30  10055.466  22.080
2006Q4  1.44  10480.888  22.125

如果我读对了,你想按季度报告,但显示每个季度与前一季度一样,对吗?我觉得(我可能错了)这会很困难,因为你有点违背了熊猫所理解的四分之一。嗨,格雷格,实际上我只需要在第一排做这件事。因此,如果第一行属于2017Q1,我想将其更改为2016Q4。但只限于第一排。我创建了一个表作为输出,以可视化我想要实现的目标。