PANDAS日期总结

时间:2018-02-02 20:38:56

标签: python-3.x pandas

我有一个pandas数据框,如下所示:

import pandas as pd

df= pd.DataFrame({'type':['Asset','Liability','Asset','Liability','Asset'],'Amount':[10,-10,20,-20,5],'Maturity Date':['2018-01-22','2018-02-22','2018-06-22','2019-06-22','2020-01-22']})
df

我想汇总日期,以便显示前四个季度,然后是年末。对于上面的数据集,我希望:

df1= pd.DataFrame({'type':['Asset','Liability','Asset','Liability','Asset'],'Amount':[10,-10,20,-20,5],'Maturity Date':['2018-01-22','2018-02-22','2018-06-22','2019-06-22','2020-01-22'],'Mat Group':['1Q18','1Q18','2Q18','FY19','FY20']})
df1

现在我使用一组loc语句来实现这一点,例如:

df.loc[(df['Maturity Date'] >'2018-01-01') & (df['Maturity Date'] <='2018-03-31'),'Mat Group']="1Q18"
df.loc[(df['Maturity Date'] >'2018-04-01') & (df['Maturity Date'] <='2018-06-30'),'Mat Group']="2Q18"

我想知道是否有更优雅的方式来达到相同的效果?也许将列表放在列表中并通过列表进行解析,以便可以使分段更灵活?

1 个答案:

答案 0 :(得分:1)

有点具体。我会用。

  • strftime格式%y以获取简短
  • 大熊猫内置quarter以获得季度
  • 用于构造字符串的python format函数
  • lambdaapply到列

结果如下。也许有更好的答案,但这个很简洁。

df['Mat Group'] = df['Maturity Date'].apply(
    lambda x: '{}Q{:%y}'.format(x.quarter, x) if x.year < 2019 
                                              else 'FY{:%y}'.format(x))
df

#    Amount Maturity Date       type Mat Group
# 0      10    2018-01-22      Asset      1Q18
# 1     -10    2018-02-22  Liability      1Q18
# 2      20    2018-06-22      Asset      2Q18
# 3     -20    2019-06-22  Liability      FY19
# 4       5    2020-01-22      Asset      FY20