四分之一的过时时间64

时间:2016-08-04 09:39:11

标签: python pandas

我的pd.DataFrame看起来像这样:

In [119]: df1
Out[119]: 
        DATES
0  2014-01-01
1  2014-01-24
2  2014-03-11
3  2014-04-09
4  2014-04-21
5  2014-05-02
6  2014-05-13
7  2014-06-11
8  2014-06-21
9  2014-07-22
10 2014-08-04

In [120]: df1.dtypes
Out[120]: 
DATES    datetime64[ns]
dtype: object

我想计算每个条目所属的季度。到目前为止我尝试过的是:

df1['QUARTER'] = df1['DATES'].map(lambda x: '2014Q1' if (x.year == 2014 & (x.month == 1 | x.month == 2 | x.month == 3)) else np.nan)

然后我得到:

In [124]: df1
Out[124]: 
        DATES  QUARTER
0  2014-01-01      NaN
1  2014-01-24      NaN
2  2014-03-11      NaN
3  2014-04-09      NaN
4  2014-04-21      NaN
5  2014-05-02      NaN
6  2014-05-13      NaN
7  2014-06-11      NaN
8  2014-06-21      NaN
9  2014-07-22      NaN
10 2014-08-04      NaN

最后,我试过了:

df1['QUARTER'] = df1['DATES'].map(lambda x: x.year + '-Q' + x.quarter)

然后我收到错误:

TypeError: unsupported operand type(s) for +: 'int' and 'str'

感谢任何想法,谢谢!

2 个答案:

答案 0 :(得分:3)

In [30]: df['QUARTER'] = pd.PeriodIndex(df['DATES'], freq='Q')

In [31]: df
Out[31]: 
        DATES QUARTER
0  2014-01-01  2014Q1
1  2014-01-24  2014Q1
2  2014-03-11  2014Q1
3  2014-04-09  2014Q2
4  2014-04-21  2014Q2
5  2014-05-02  2014Q2
6  2014-05-13  2014Q2
7  2014-06-11  2014Q2
8  2014-06-21  2014Q2
9  2014-07-22  2014Q3
10 2014-08-04  2014Q3

df['QUARTER']中的值为Periods。如果您喜欢字符串,请使用

df['QUARTER'] = pd.PeriodIndex(df['DATES'], freq='Q').format()

顺便说一句,也可以通过添加字符串和字符串值系列来构建所需的结果:

In [59]: df['DATES'].dt.year.astype(str) + 'Q' + df['DATES'].dt.quarter.astype(str)
Out[59]: 
0     2014Q1
1     2014Q1
2     2014Q1
3     2014Q2
4     2014Q2
5     2014Q2
6     2014Q2
7     2014Q2
8     2014Q2
9     2014Q3
10    2014Q3
Name: DATES, dtype: object

将来可能对你有用,不过在这种情况下你不需要弄脏你的手。

答案 1 :(得分:1)

您可以使用dt访问者:

df1['QUARTER'] = df1['DATES'].dt.quarter