Python3 Как преобразовать дату в месячные периоды, где первый период - сентябрь - PullRequest
2 голосов
/ 01 мая 2019

Работа с группой, чей финансовый год начинается в сентябре.У меня есть дата-фрейм с кучей дат, которые я хочу рассчитать на месячный период, который = 1 в сентябре.

Что работает:

# Convert date column to datetime format
df['Hours_Date'] = pd.to_datetime(df['Hours_Date'])

# First quarter starts in September - Yes!   
df['Quarter'] = pd.PeriodIndex(df['Hours_Date'], freq='Q-Aug').strftime('Q%q')

Что не работает:

# Gives me monthly periods starting in January.  Don't want.
df['Period'] = pd.PeriodIndex(df['Hours_Date'], freq='M').strftime('%m')

# Gives me an error
df['Period'] = pd.PeriodIndex(df['Hours_Date'], freq='M-Aug').strftime('%m')

Есть ли способ настроить месячную частоту?

Ответы [ 2 ]

2 голосов
/ 01 мая 2019

Я думаю, что это не реализовано, проверьте якорные смещения .

Возможное решение - вычесть или Index.shift 8 для сдвига на 8 месяцев:

rng = pd.date_range('2017-04-03', periods=10, freq='m')
df = pd.DataFrame({'Hours_Date': rng}) 

df['Period'] = (pd.PeriodIndex(df['Hours_Date'], freq='M') - 8).strftime('%m')

Или:

df['Period'] = pd.PeriodIndex(df['Hours_Date'], freq='M').shift(-8).strftime('%m')

print (df)
  Hours_Date Period
0 2017-04-30     08
1 2017-05-31     09
2 2017-06-30     10
3 2017-07-31     11
4 2017-08-31     12
5 2017-09-30     01
6 2017-10-31     02
7 2017-11-30     03
8 2017-12-31     04
9 2018-01-31     05
1 голос
/ 01 мая 2019

Я думаю, что «M-Aug» неприменимо для месяца, так что вы можете сделать небольшую корректировку, используя np.where, Данные от Джез

np.where(df['Hours_Date'].dt.month-8<=0,df['Hours_Date'].dt.month+4,df['Hours_Date'].dt.month-8)
Out[271]: array([ 8,  9, 10, 11, 12,  1,  2,  3,  4,  5], dtype=int64)
...