Python 需要计算从第15天到下个月第15天的操作总数

Python 需要计算从第15天到下个月第15天的操作总数,python,pandas,Python,Pandas,我需要为每个id-dp\u id对从每月15日开始的每个期间(例如15.10-14.11、15.11-14.12等)的浮动日期的值求和 我的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 ...

我需要为每个
id
-
dp\u id
对从每月15日开始的每个期间(例如15.10-14.11、15.11-14.12等)的浮动日期的值求和

我的
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
预期输出表,但不是严格变量: 如何在输出中标记此期间并不重要 对于ex 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
  ...............................
我试着用grouper方法来解决这个问题,但它对我不起作用

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)
输出:

                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

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)
输出:

                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)
其输出将为:

        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

首先,您需要创建一个包含年和月的列。年份和月份必须以月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)
其输出将为:

        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

接近true,但对于每对'id'-'dp',我只需要'value'列的和。在你的例子中,我们得到了每一列的总和,我不确定我是否得到了它,但我添加了一些调整。面具一天以前就被摘下来了。这就是您的想法吗?接近于真,但我只需要每对'id'-'dp'的'value'列的总和。在你的例子中,我们得到了每一列的总和,我不确定我是否得到了它,但我添加了一些调整。面具一天以前就被摘下来了。你是这么想的吗?25号到24号?或者25日到25日?不是日历月,从本月15日到下个月14日,包括25日到24日?或者25日到25日?不是日历月,从本月15日到下个月14日,包括,对不起