python/pandas将列折叠为日期时间季度

python/pandas将列折叠为日期时间季度,python,pandas,Python,Pandas,我有一个数据框架,其中有一组列以“YYYY-MM”格式标记,还有一些其他列。我需要将日期列折叠成日历季度,然后取平均值;我可以手动完成,但在我的真实数据中有几百个日期列,我不想手动映射其中的每一个。我从CSV生成初始df;我在read_csv中没有看到任何看起来有用的东西,但是如果有什么我可以利用的,那就太好了。我发现将datetime对象转换为quarter的dataframe.dt.to_period(“Q”),但如果可以的话,我不太确定如何在这里应用它 下面是一个示例df(代码如下): 这

我有一个数据框架,其中有一组列以“YYYY-MM”格式标记,还有一些其他列。我需要将日期列折叠成日历季度,然后取平均值;我可以手动完成,但在我的真实数据中有几百个日期列,我不想手动映射其中的每一个。我从CSV生成初始df;我在
read_csv
中没有看到任何看起来有用的东西,但是如果有什么我可以利用的,那就太好了。我发现将datetime对象转换为quarter的
dataframe.dt.to_period(“Q”)
,但如果可以的话,我不太确定如何在这里应用它

下面是一个示例df(代码如下):

这段代码将完成我正在寻找的功能,但我必须手动生成映射:

mapping={'2016-04':'2016q2','2016-05':'2016q2','2016-06':'2016q2','2016-07':'2016q3','2016-08':'2016q3'}
df=df.set_index(['foo','bar']).groupby(映射,轴=1.mean().reset_index()
新df:

foo-bar 2016q2 2016q3
0   6   5   3.666667    4.5
1   9   3   8.000000    7.5
2   8   5   6.000000    6.5
3   5   8   2.000000    5.5
4   4   5   3.333333    4.0
生成初始df的代码:

df=pd.DataFrame(np.random.randint(1,11,大小=(5,7)),列=('foo','bar','2016-04','2016-05','2016-06','2016-07','2016-08')),'2016-07','2016-08'))

使用应用于索引值的可调用函数。使用
axis=1
将其应用于列值

(df.set_index(['foo', 'bar'])
   .groupby(lambda x: pd.Period(x, 'Q'), axis=1)
   .mean().reset_index())

   foo  bar    2016Q2  2016Q3
0    6    5  3.666667     4.5
1    9    3  8.000000     7.5
2    8    5  6.000000     6.5
3    5    8  2.000000     5.5
4    4    5  3.333333     4.0

解决方案非常简短:

从将“每月”列复制到另一个数据帧并转换开始 要索引的列名:

然后,为了得到结果,按季度对列重新采样, 计算平均值(每个季度),并加入2个“初始”列:


可能重复:您可以尝试类似于
pd.PeriodIndex(pd.to_datetime(df.columns[2:])、freq='Q').map(str)的方法,而不是手动转换列名
@jml首先将年份列和其他列分开,然后应用groupby with period index函数,在该函数之后只传递年份列,并将此数据框与数据框的其他字段连接在一起。输出如下:这是完美的,正是我想要的。非常感谢。
(df.set_index(['foo', 'bar'])
   .groupby(lambda x: pd.Period(x, 'Q'), axis=1)
   .mean().reset_index())

   foo  bar    2016Q2  2016Q3
0    6    5  3.666667     4.5
1    9    3  8.000000     7.5
2    8    5  6.000000     6.5
3    5    8  2.000000     5.5
4    4    5  3.333333     4.0
df2 = df.iloc[:, 2:]
df2.columns = pd.PeriodIndex(df2.columns, freq='M')
df.iloc[:, :2].join(df2.resample('Q', axis=1).agg('mean'))
data = [[2,2,2,3,3,3],[1,2,2,3,4,5],[1,2,2,3,4,5],[1,2,2,3,4,5],[1,2,2,3,4,5],[1,2,2,3,4,5]]
df = pd.DataFrame(data, columns = ['A','1996-04','1996-05','2000-07','2000-08','2010-10'])
# separate year columns and other columns
# separate year columns
df3 = df.iloc[:, 1:]
# separate other columns
df2 = df.iloc[:,0]
#apply groupby using period index
df3=df3.groupby(pd.PeriodIndex(df3.columns, freq='Q'), axis=1).mean()
final_df = pd.concat([df3,df2], axis=1)
print(final_df)