2014-08-11 4 views
3

Я пытаюсь получить неделю на месяц, некоторые месяцы могут иметь четыре недели, у некоторых может быть пять. За каждую дату я хотел бы знать, к какой неделе она принадлежит. Меня больше всего интересует последняя неделя месяца.Неделя месяца pandas

data = pd.DataFrame(pd.date_range(' 1/ 1/ 2000', periods = 100, freq ='D')) 

0 2000-01-01 
1 2000-01-02 
2 2000-01-03 
3 2000-01-04 
4 2000-01-05 
5 2000-01-06 
6 2000-01-07 

ответ

5

Посмотрите это answer и решите, какую неделю месяца вы хотите.

Нет ничего встроенного, поэтому вам нужно будет рассчитать его с применением. Например, для простой «сколько семидневных периодов прошло».

data['wom'] = data[0].apply(lambda d: (d.day-1) // 7 + 1) 

Для более сложного (на основе каландра), используя функцию из этого ответа.

import datetime 
import calendar 

def week_of_month(tgtdate): 
    tgtdate = tgtdate.to_datetime() 

    days_this_month = calendar.mdays[tgtdate.month] 
    for i in range(1, days_this_month): 
     d = datetime.datetime(tgtdate.year, tgtdate.month, i) 
     if d.day - d.weekday() > 0: 
      startdate = d 
      break 
    # now we canuse the modulo 7 appraoch 
    return (tgtdate - startdate).days //7 + 1 

data['calendar_wom'] = data[0].apply(week_of_month) 
+1

на самом деле это было бы легко повышение (уже есть '' weekofyear''), так что расширение (будет в Cython): https://github.com/pydata/pandas/issues/7986, если вы хотите сделать запрос на pull. – Jeff

+0

@chrisb Спасибо, это то, что я искал. – user3816493

1

Это, кажется, делает трюк для меня

df_dates = pd.DataFrame({'date':pd.bdate_range(df['date'].min(),df['date'].max())}) 
df_dates_tues = df_dates[df_dates['date'].dt.weekday==2].copy() 
df_dates_tues['week']=np.mod(df_dates_tues['date'].dt.strftime('%W').astype(int),4) 
Смежные вопросы