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日,包括,对不起