我有一个名为'score'的系列,带有日期时间索引。
我希望按quarter
和year
来分组
伪代码:series.loc['q2 of 2013']
到目前为止的尝试:
s.dt.quarter
AttributeError:只能使用带日期时间值的.dt访问器
s.index.dt.quarter
AttributeError:'DatetimeIndex'对象没有属性'dt'
这是有效的(灵感来自this answer),但我无法相信这是在熊猫中做到这一点的正确方法:
d = pd.DataFrame(s)
d['date'] = pd.to_datetime(d.index)
d.loc[(d['date'].dt.quarter == 2) & (d['date'].dt.year == 2013)]['scores']
我希望有一种方法可以在不转换为数据集的情况下执行此操作,将索引强制转换为datetime,然后从中获取Series。
我错过了什么,在Pandas系列中做到这一点的优雅方式是什么?
答案 0 :(得分:2)
import numpy as np
import pandas as pd
index = pd.date_range('2013-01-01', freq='M', periods=12)
s = pd.Series(np.random.rand(12), index=index)
print(s)
# 2013-01-31 0.820672
# 2013-02-28 0.994890
# 2013-03-31 0.928376
# 2013-04-30 0.848532
# 2013-05-31 0.122263
# 2013-06-30 0.305741
# 2013-07-31 0.088432
# 2013-08-31 0.647288
# 2013-09-30 0.640308
# 2013-10-31 0.737139
# 2013-11-30 0.233656
# 2013-12-31 0.245214
# Freq: M, dtype: float64
d = pd.Series(s.index, index=s.index)
quarter = d.dt.quarter.astype(str) + 'Q' + d.dt.year.astype(str)
print(quarter)
# 2013-01-31 1Q2013
# 2013-02-28 1Q2013
# 2013-03-31 1Q2013
# 2013-04-30 2Q2013
# 2013-05-31 2Q2013
# 2013-06-30 2Q2013
# 2013-07-31 3Q2013
# 2013-08-31 3Q2013
# 2013-09-30 3Q2013
# 2013-10-31 4Q2013
# 2013-11-30 4Q2013
# 2013-12-31 4Q2013
# Freq: M, dtype: object
print(s[quarter == '1Q2013'])
# 2013-01-31 0.124398
# 2013-02-28 0.052828
# 2013-03-31 0.126374
# Freq: M, dtype: float64
如果您不想创建一个新系列,每个季度都有一个标签(例如,如果您只进行一次子集化),您甚至可以
print(s[(s.index.quarter == 1) & (s.index.year == 2013)])
# 2013-01-31 0.124398
# 2013-02-28 0.052828
# 2013-03-31 0.126374
# Freq: M, dtype: float64
答案 1 :(得分:2)
假设您有一个这样的数据框:
sa
Out[28]:
0
1970-01-31 1
1970-02-28 2
1970-03-31 3
1970-04-30 4
1970-05-31 5
1970-06-30 6
1970-07-31 7
1970-08-31 8
1970-09-30 9
1970-10-31 10
1970-11-30 11
1970-12-31 12
如果索引是日期时间,那么您可以将该季度作为sa.index.quarter
:
sa.index.quarter
Out[30]: array([1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4])
答案 2 :(得分:0)
如果您知道2013年第二季度的年份和季度,那么您可以这样做:
s['2013-04':'2013-06']
将其包装成一个函数:
qmap = pd.DataFrame([
('01', '03'), ('04', '06'), ('07', '09'), ('10', '12')
], list('1234'), list('se')).T
def get_quarter(df, year, quarter):
s, e = qmap[str(quarter)]
y = str(year)
s = y + '-' + s
e = y + '-' + e
return df[s:e]
并称之为:
get_quarter(s, 2013, 2)
假设s
是:
s = pd.Series(range(32), pd.date_range('2011-01-01', periods=32, freq='Q'))
然后我得到:
2013-03-31 8
Freq: Q-DEC, dtype: int64