我有一个数据帧,其值如下-
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
如果它不涉及循环,那就太好了(因为我也有产品的循环( 我尝试将周和月分开(分组(并进行计算,但由于它是数据帧中的一列,因此无法获得预期的结果。
提前谢谢。感谢帮助。
首先,我有点担心,因为你说你在熊猫身上使用循环......你永远不应该使用熊猫的循环,它们不是为它而生的,而且非常缓慢和无效。在某些情况下,您无法避免它,但即便如此,也有选择可以更好地优化它。
要回答您的问题,您首先需要将文档日期转换为日期时间格式:
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()
这里的resample('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
如果需要输出中的日期时间:
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