Фильтрация серии дат в python по четным месяцам и концу месяцев - PullRequest
0 голосов
/ 20 января 2020

Я использую spyder и python 3.8.

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

Я создал свой date_range следующим образом:

from pandas.tseries.holiday import USFederalHolidayCalendar
from pandas.tseries.offsets import CustomBusinessDay
import pandas as pd
us_bd = CustomBusinessDay(calendar=USFederalHolidayCalendar())
start = '2009-12-31'
end = '2020-01-17'
rng = pd.Series(pd.to_datetime(pd.date_range(start,end, freq=us_bd).date))

Тогда я знаю, что могу проверить, равен ли месяц

mth = datetime.datetime.strptime(str(start),"%Y-%m-%d %H:%M:%S").month
if (mth % 2 == 0):
  # keep date

Как проверить, является ли этот день последним днем ​​месяца и рабочим днем, а не выходным днем. Если True, то сохранить дату, в противном случае удалить дату?

1 Ответ

0 голосов
/ 20 января 2020

Так что я смог понять это, но это могло бы быть чище.

rng = pd.Series(pd.to_datetime(pd.date_range(start,end, freq=us_bd).date))
rng = [date for date in rng if datetime.datetime.strptime(str(date),"%Y-%m-%d %H:%M:%S").month % 2 == 0]
rng_df = pd.DataFrame({'date':rng})
rng_df['Year']= rng_df['date'].dt.year
rng_df['Month']=rng_df['date'].dt.month
rng_df['Day']=rng_df['date'].dt.day
rng_df['ym_cuml'] = rng_df.groupby(['Year','Month']).cumcount()
rng_df['group'] = pd.to_datetime(rng_df[['Year', 'Month']].assign(Day=1))
groups = pd.Series(np.unique(rng_df['group']))
groups = groups.apply(lambda x : x.strftime('%Y-%m-%d'))

dates = []
for group in groups:
    sub_rng_df = rng_df.loc[rng_df.group == group]
    mx = sub_rng_df['ym_cuml'].max()
    date_to_append = sub_rng_df.iloc[mx]['date']
    date_to_append = date_to_append.strftime('%Y-%m-%d')
    dates.append(date_to_append)
...