Вечерние парни, надеюсь, этот вопрос лучше моего первого в начале этого года, получившего -7!(чему я на самом деле был благодарен, поскольку это помогло подчеркнуть мое невежество)
То, чего я пытаюсь добиться, - это написать хитрую строку кода, которую я могу вызвать в любом массиве данных Iработать, чтобы получить правильный номер недели или день недели.
сейчас, пожалуйста, рассмотрите следующий фрейм данных:
import pandas as pd
import numpy as np
days = pd.date_range('01/01/2018', '01/04/2019', freq='D')
df = pd.DataFrame({'Date': days})
print(df.head(5))
Date
0 2018-01-01
1 2018-01-02
2 2018-01-03
3 2018-01-04
4 2018-01-05
Теперь я хочу создать номер недели компании, используя следующую строку кода:
пожалуйста, обратите вниманиечто моя компания использует финансовый календарь, поэтому апрель - это неделя 1, а день 1 - суббота (проницательные из вас, наверное, уже знают мою проблему)!так что для 2018 года 31.03.18 - это мой финансовый день, посвященный Дню 1 Недели 1, как суббота, и у нас может быть только 53 максимальных недели.
df['Week'] = np.where(df['Date'].dt.month >= 4, (df['Date'] + pd.Timedelta(days=2)).dt.week - 13,
(df['Date'] + pd.Timedelta(days=2)).dt.week + 39)
print(df)
Date Week
0 2018-01-31 44
1 2018-02-01 44
2 2018-02-02 44
пока все хорошо, верно?
поэтому давайте проверим декабрь
dec = df.Date.dt.month == 12
print(df.loc[dec].tail(5))
Date Week
330 2018-12-27 39
331 2018-12-28 39
332 2018-12-29 -12
333 2018-12-30 -12
334 2018-12-31 -12
Вопрос, если я понимаю, что это попытка pd.Timedeltaчтобы правильно разместить номер моей недели, но из-за моей первоначальной формулы month >= 4
он будет обозначен как -12
. Кроме того, 31 марта должно быть в 1-й неделе, а не в 53-й, как в субботу.
Если предположить, что это очень распространенная задача, над которой, возможно, работали многие люди, есть ли у кого-нибудь способ или способ решить эту проблему питонским способом.
мое собственное решение в моей головесостоит в том, чтобы вручную создать фрейм данных и вручную зафиксировать неделю, день и финансовый год, поместить их в дБ на базе данных noSQL или SQL и вызвать их в каждом dF и объединить номер недели с моим отчетом.