我的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'
感谢任何想法,谢谢!
答案 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