Попытка написать несколько строк кода для создания таблицы поиска основной даты - PullRequest
0 голосов
/ 10 декабря 2018

Вечерние парни, надеюсь, этот вопрос лучше моего первого в начале этого года, получившего -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 и объединить номер недели с моим отчетом.

1 Ответ

0 голосов
/ 10 декабря 2018

IIUC, используйте fiscalyear в качестве ввода для вашего диапазона;

from fiscalyear import *

a = fiscalyear.FiscalYear(2018)

fiscalyear.START_MONTH = 4

days = pd.date_range(a.start, a.end, freq='D')
df = pd.DataFrame({'Date': days})

Затем используйте код, который вы написали сами для назначения номеров недели;

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)

Только так, как я могудумать об изменении значений этих трех дней в конце декабря;

df['Week'] = np.where(df['Week'] <= 0, 40, df['Week'])

print(df.iloc[270:280])

          Date  Week
270 2018-12-27    39
271 2018-12-28    39
272 2018-12-29    40
273 2018-12-30    40
274 2018-12-31    40
275 2019-01-01    40
276 2019-01-02    40
277 2019-01-03    40
278 2019-01-04    40
279 2019-01-05    41

Примечание;Что касается номеров недели на 30 и 31 марта, я бы сделал то же самое:

df['Week'] = np.where(df['Week'] > 52, 1, df['Week'])

print(df.iloc[358:365])

          Date  Week
358 2019-03-25    52
359 2019-03-26    52
360 2019-03-27    52
361 2019-03-28    52
362 2019-03-29    52
363 2019-03-30     1
364 2019-03-31     1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...