订购星期几

时间:2019-01-05 21:17:34

标签: pandas

假设我的数据框中有一列日期。

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年内有点慢,我已经工作了很多年。有没有更有效或更简单的方法来执行此计算?

2 个答案:

答案 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()