如何在DataFrame中将日期转换为Year.Q fomat

时间:2017-02-22 02:21:18

标签: python pandas

   2000-01   2000-02   2000-03   2000 -04 ......   2016-08
0    1010       43453      5564       45545           15555
1    4565       44646      8989       56565           56565

我有一个像这样的数据框。我需要添加一些像“2000q1”这样的列,这意味着2000-01,2000-02,2000-03的平均值。因此,第4-6个月是q2,第7-9个月是q3,第10个月是q4。 我认为结果应该是这样的:

2000q1       2000q2    2000q3   2000q4  2001q1......2016q3
16675.67     15615     ...................................
19400        55665     ...................................

我认为第一步是将列转换为datetime。

import pandas as pd
df.columns.map(pd.to_datetime)

但我不知道下一步是什么

我有一个想法,但它不起作用。 我使用循环。

d = []
for i in range(2000,2017):
    i=str(i)
    d.append(i+'q'+str(1))
    d.append(i+'q'+str(2))
    d.append(i+'q'+str(3))
    d.append(i+'q'+str(4))
#I create a list contains the date I need. Next step is put mean values in.
d = d[:-1] #remove 2016q4 from list because the date untill 2016-08
for date in d:
    for a in range(0,201,3):
        average = np.mean(df.iloc[:,a:a+3])
        df[date] = average   

但结果显示新列都是NaN值。

1 个答案:

答案 0 :(得分:1)

您可以将列标题转换为datetime,然后转换为to_period Quarters,按列名称分组,并计算沿行方向的平均值:

实施例

import pandas as pd

df
#2000-01  2000-02  2000-03  2000-04
#0  1010    43453     5564    45545
#1  4565    44646     8989    56565

df.columns = pd.to_datetime(df.columns, format="%Y-%m").to_period("Q")    
df.groupby(level=0, axis=1).mean()

#         2000Q1     2000Q2
#0  16675.666667    45545.0
#1  19400.000000    56565.0