假设我的数据框中有一列日期。
import pandas as pd
import numpy as np
t = pd.date_range('2019-01-01', '2019-12-31')
df = pd.DataFrame({'dates':t})
我想知道哪个行是每月的第一个星期五,第二个星期五,第n个星期五。我想在周一至周五,周六和周日的每一天进行此操作。
现在,我可以这样做:
df['dow'] = df.dates.dt.day_name()
df['month'] = df.dates.dt.month_name()
frames = []
for name, frame in df.groupby(['dow','month']):
frame.loc[:,'dow_order'] = np.arange(frame.shape[0])
frames.append(frame)
pd.concat(frames)
这将返回
dates dow month dow_order
94 2019-04-05 Friday April 0
101 2019-04-12 Friday April 1
108 2019-04-19 Friday April 2
115 2019-04-26 Friday April 3
213 2019-08-02 Friday August 0
所以我知道'2019-04-05'是四月的第一星期五。
此循环在短短1年内有点慢,我已经工作了很多年。有没有更有效或更简单的方法来执行此计算?
答案 0 :(得分:1)
如果我理解正确,则可以使用cumcount:
import pandas as pd
t = pd.date_range('2019-01-01', '2019-12-31')
df = pd.DataFrame({'dates':t})
df['dow'] = df.dates.dt.day_name()
df['month'] = df.dates.dt.month_name()
df['dow_order'] = df.groupby(['dow', 'month']).cumcount()
df = df.sort_values(['dow', 'month'])
print(df.head(10))
输出
dates dow month dow_order
94 2019-04-05 Friday April 0
101 2019-04-12 Friday April 1
108 2019-04-19 Friday April 2
115 2019-04-26 Friday April 3
213 2019-08-02 Friday August 0
220 2019-08-09 Friday August 1
227 2019-08-16 Friday August 2
234 2019-08-23 Friday August 3
241 2019-08-30 Friday August 4
339 2019-12-06 Friday December 0
答案 1 :(得分:0)
如果只需要dow_order
,则不需要在两列中创建month
和 day of week
df['dow_order']=df.groupby(df.dates.dt.strftime('%m-%w')).cumcount()