Python Pandas Dataframe - вычислять сумму значений каждые две недели - PullRequest
0 голосов
/ 29 июня 2018

У меня есть датафрейм со значениями, как показано ниже -

               Amount  Product  DocDate
0              1099.0   1100 2018-01-02
1              1234.0   1100 2018-01-04
2              1000.0   1100 2018-01-06
3              8000.0   1100 2018-01-28
4              3000.0   1100 2018-02-09
5              4500.0   1100 2018-02-20

Мне нужно вычислить сумму поля суммы, рассчитанную в конце каждой недели.

Пример:

Product Amount FortNight
1100    3333.0  Jan 1st Fortnight (this could be date format too!!)
1100    3000.0  Feb 2nd Fortnight
1100    4500.0  Feb 1st Fortnight

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

Заранее спасибо. Ценю помощь.

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Требуется:

#if necessary convert column to datetime
df['DocDate'] = pd.to_datetime(df['DocDate'])
#generate Fortnight https://stackoverflow.com/a/34428879
s =  np.where(df['DocDate'].dt.day < 15, '1st Fortnight', '2nd Fortnight')
#create new column
df['FortNight'] = df['DocDate'].dt.strftime('%b ') + s
#aggregate sum
df = df.groupby(['Product','FortNight'], as_index=False, sort=False)['Amount'].sum()
print (df)
   Product          FortNight  Amount
0     1100  Jan 1st Fortnight  3333.0
1     1100  Jan 2nd Fortnight  8000.0
2     1100  Feb 1st Fortnight  3000.0
3     1100  Feb 2nd Fortnight  4500.0

Если нужны выходные данные в выходных данных:

s =  np.where(df['DocDate'].dt.day < 15, '-01', '-15')
df['FortNight'] = pd.to_datetime(df['DocDate'].dt.strftime('%Y-%m') + s)

df = df.groupby(['Product','FortNight'], as_index=False, sort=False)['Amount'].sum()
print (df)
   Product  FortNight  Amount
0     1100 2018-01-01  3333.0
1     1100 2018-01-15  8000.0
2     1100 2018-02-01  3000.0
3     1100 2018-02-15  4500.0
0 голосов
/ 29 июня 2018

Прежде всего, я немного обеспокоен тем, что вы сказали, что используете петли с пандами ... НИКОГДА не используйте петли с пандами, они не предназначены для этого и чрезвычайно медленны и неэффективны. Есть действительно редкие случаи, когда вы не можете избежать этого, но даже тогда есть варианты, чтобы оптимизировать его лучше.

Чтобы ответить на ваш вопрос, сначала необходимо преобразовать DocDate в формат datetime:

from datetime import datetime
df.DocDate = df.DocDate.apply(lambda d: datetime.strptime(d, %Y-%m-%d))

Затем вы можете использовать функцию datetimeIndex.resample, которая работает точно так же, как сгруппированные, но позволяет группировать данные по временному ограничению:

df = df.set_index('DocDate').resample('2W').Amount.sum()

resample('2W') здесь означает группирование по 2-недельным периодам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...