[英]Need to count the total sum of operations from 15th day to 15th day of next month
我需要對自每月第 15 天以來的每個時期的浮動日期的值求和,例如。 15.10-14.11、15.11-14.12 等為每對id
- dp_id
。
我的df
:
date id dp value
2020-11-13 300000 002 500,00
2020-11-14 352575 001 400,00
2020-11-15 352575 001 100,00
2020-11-16 352575 001 500,00
...............................
`days from 17.11-12.14`
...............................
2020-12-15 300000 002 700,00
2020-12-16 352575 001 200,00
2020-12-17 352575 001 500,00
2020-12-18 352575 002 600,00
預期的 output 表,但不是嚴格的變體:如何在 output 中為前 2020-11-01 標記此期間可能意味着 15.10-14.11
period id dp value
2020-11-01 300000 002 500,00
2020-11-01 352575 001 400,00
2021-11-01 352575 002 1000,00
2020-12-01 300000 002 700,00
2020-12-01 352575 001 700,00
2020-12-01 352575 002 600,00
...............................
我試圖通過石斑魚方法解決問題,但這對我不起作用
def grouper(x):
d = x.rename('date').to_frame().reset_index()
return d.groupby(pd.Grouper(key='date', freq='M', origin='start')).cumsum()
df['sum'] = df.groupby(['id', 'dp'])['date'].transform(grouper)
IIUC,這是一種選擇:
df['custom_period'] = (df.index.day == 15 - 1).cumsum() # Begin on every 15th
df['value'] = df.groupby(['custom_period', 'id', 'dp'])['value'].transform('cumsum')
df.drop('custom_period', axis=1, inplace=True)
Output:
id dp value
date
2020-11-13 300000 2 500
2020-11-14 352575 1 400
2020-11-15 352575 1 500
2020-11-16 352575 1 1000
2020-12-15 300000 2 700
2020-12-16 352575 1 1200
2020-12-17 352575 1 1700
2020-12-18 352575 2 600
首先,您需要創建一個包含年份和月份的列。 年份和月份必須基於每月 15 日至 14 日。 從 15 日到 31 日的任何值都應低於下個月。 為此,請使用pd.DateOffset(months=1)
將值增加到下個月。 您可以使用df.date.dt.day
獲取日期的日期部分。 檢查它是否大於14
。 如果是這樣,將月份移動 1。
現在您在另一列中有年月,將其用於 groupby。 如果您希望每一行都有值,請使用 groupby.transform()。 如果您只想要摘要,則使用.sum()。
這是獲取每行總和的代碼。
c = ['date','id','dp','value']
d = [['2020-11-13', 300000, '002', 500.00],
['2020-11-14', 352575, '001', 400.00],
['2020-11-15', 352575, '001', 100.00],
['2020-11-16', 352575, '001', 500.00],
['2020-12-15', 300000, '002', 700.00],
['2020-12-16', 352575, '001', 200.00],
['2020-12-17', 352575, '001', 500.00],
['2020-12-18', 352575, '002', 600.00]]
import pandas as pd
df = pd.DataFrame(d,columns=c)
df['date'] = pd.to_datetime(df['date'])
df['Year-Mon'] = df.date.dt.strftime('%Y-%m')
#
df.loc[df.date.dt.day > 14, 'Year-Mon'] = (df.date + pd.DateOffset(months=1)).dt.strftime('%Y-%m')
df['sum'] = df.groupby(['id', 'dp', 'Year-Mon'])['value'].transform('sum')
print (df)
output 將是:
date id dp value Year-Mon sum
0 2020-11-13 300000 002 500.0 2020-11 500.0
1 2020-11-14 352575 001 400.0 2020-11 400.0
2 2020-11-15 352575 001 100.0 2020-12 600.0
3 2020-11-16 352575 001 500.0 2020-12 600.0
4 2020-12-15 300000 002 700.0 2021-01 700.0
5 2020-12-16 352575 001 200.0 2021-01 700.0
6 2020-12-17 352575 001 500.0 2021-01 700.0
7 2020-12-18 352575 002 600.0 2021-01 600.0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.