我有一些日期,我试图推断该季度。我粗暴地强迫解决方案,但我希望能够计算从日期开始的季度,以确保数据的完整性。
第一行将始终是一个季度的最后一天,并且是第0季度。在此之后,季度应该在递增之前重复三次。例如,0,1,1,1,2,2,2。
我已经附上了下面的蛮力解决方案,但有没有人知道实现这一目标的优雅解决方案?或者知道我可以应用的日期时间公式,以使用开始/当前日期来解析为四分之一数字?
quarters = [0]
for n in xrange(1, len(date_range)):
for i in xrange(3):
quarters.append(n)
quarters = quarters[:len(date_range)]
launchpoint_date = pd.to_datetime('2017-03-31')
date_range = pd.DataFrame({'Date': [pd.to_datetime('2017-03-31'),
pd.to_datetime('2017-04-30'),
pd.to_datetime('2017-05-31'),
pd.to_datetime('2017-06-30'),
pd.to_datetime('2017-07-31'),
pd.to_datetime('2017-08-31'),
pd.to_datetime('2017-09-30'),
pd.to_datetime('2017-10-31'),
pd.to_datetime('2017-11-30'),
pd.to_datetime('2017-12-31'),
pd.to_datetime('2018-01-31'),
pd.to_datetime('2018-02-28'),
pd.to_datetime('2018-03-31'),
pd.to_datetime('2018-04-30'),
pd.to_datetime('2018-05-31'),
pd.to_datetime('2018-06-30'),
pd.to_datetime('2018-07-31'),
pd.to_datetime('2018-08-31')],
'Month': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17]})
launchpoint_date = launchpoint_date.month
date_range['Quarter'] = quarters
date_range
答案 0 :(得分:2)
您可以pd.Grouper
与frequency quarter
和ngroup
使用
date_range['new'] = date_range.groupby([pd.Grouper(key='Date',freq='q')]).ngroup()
输出:
Date Month Quarter new 0 2017-03-31 0 0 0 1 2017-04-30 1 1 1 2 2017-05-31 2 1 1 3 2017-06-30 3 1 1 4 2017-07-31 4 2 2 5 2017-08-31 5 2 2 6 2017-09-30 6 2 2 7 2017-10-31 7 3 3 8 2017-11-30 8 3 3 9 2017-12-31 9 3 3 10 2018-01-31 10 4 4 11 2018-02-28 11 4 4 12 2018-03-31 12 4 4 13 2018-04-30 13 5 5 14 2018-05-31 14 5 5 15 2018-06-30 15 5 5 16 2018-07-31 16 6 6 17 2018-08-31 17 6 6
答案 1 :(得分:2)
使用日期时间访问器.dt
,您可以提取任何单个元素:年,周,小时等。
( ( date_range['Date'].dt.quarter - 1 ) +
( date_range['Date'].dt.year - 2017 ) * 4 )
结果:
0 0
1 1
2 1
3 1
4 2
5 2
6 2
7 3
8 3
9 3
10 4
11 4
12 4
13 5
14 5
15 5
16 6
17 6