Python Dataframe—每两周计算一次值的总和

Python Dataframe—每两周计算一次值的总和,python,pandas,Python,Pandas,我有一个数据框,其值如下- 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

我有一个数据框,其值如下-

               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
如果它不涉及循环就太好了(因为我也有产品循环) 我尝试将周和月分开(分组)并进行计算,但无法得到预期的结果,因为它是dataframe中的一列


提前谢谢。感谢您的帮助。

首先,我有点担心,因为您说您正在对熊猫使用循环。。。你不应该在熊猫身上使用环,因为它们不是专门为它设计的,而且速度非常慢,效率也非常低。有一些非常罕见的情况下,你无法避免它,但即使这样,也有选择,以优化它更好

要回答您的问题,首先需要将DocDate格式转换为datetime格式:

from datetime import datetime
df.DocDate = df.DocDate.apply(lambda d: datetime.strptime(d, %Y-%m-%d))
然后,您可以使用
datetimeIndex.resample
函数,该函数的工作原理与groupby完全相同,但允许您按时间限制对数据进行分组:

df = df.set_index('DocDate').resample('2W').Amount.sum()
重采样('2W')
这里指的是按2周周期分组。

需要:

#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
#如有必要,将列转换为日期时间
df['DocDate']=pd.to_datetime(df['DocDate'])
#生成两周https://stackoverflow.com/a/34428879
s=np.式中(df['DocDate'].dt.日<15,'第一个两周','第二个两周')
#创建新列
df['FortNight']=df['DocDate'].dt.strftime('%b')+s
#总金额
df=df.groupby(['Product','fortuning'],as_index=False,sort=False)['Amount'].sum()
打印(df)
产品两周金额
0 1100一月一日两周3333.0
1100年1月2日两周8000.0
2 1100 2月1日两周3000.0
3 1100 2月2日两周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
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','fortuning'],as_index=False,sort=False)['Amount'].sum()
打印(df)
产品两周金额
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

这会有帮助吗:如果我的答案有帮助,别忘了-单击答案旁边的复选标记,将其从灰色变为填充。谢谢。对不起,也许我的问题错了。。我会循环浏览一份产品清单[110012001300…等等]。。对于每个产品,我将创建一个数据框,其中包含与该产品相关的数据集,并需要执行求和。。