簡體   English   中英

需要計算從下個月15號到15號的操作總和

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM