Python 3.x 基于日期的计算
我有这个数据框:Python 3.x 基于日期的计算,python-3.x,pandas,dataframe,Python 3.x,Pandas,Dataframe,我有这个数据框: a = [1, 2, 3, 4, 5] b = ['2019-08-01', '2019-09-01', '2019-10-23', '2019-11-12', '2019-11-30'] c = [12, 0, 0, 0, 0] d = [0, 23, 0, 0, 0] e = [12, 24, 35, 0, 0] f = [0, 0, 44, 56, 82] g = [21, 22, 17, 75, 63] df = pd.DataFrame({'ID': a, 'Dat
a = [1, 2, 3, 4, 5]
b = ['2019-08-01', '2019-09-01', '2019-10-23', '2019-11-12', '2019-11-30']
c = [12, 0, 0, 0, 0]
d = [0, 23, 0, 0, 0]
e = [12, 24, 35, 0, 0]
f = [0, 0, 44, 56, 82]
g = [21, 22, 17, 75, 63]
df = pd.DataFrame({'ID': a, 'Date': b, 'Unit_sold_8': c,
'Unit_sold_9': d, 'Unit_sold_10': e, 'Unit_sold_11': f,
'Unit_sold_12': g})
df['Date'] = pd.to_datetime(df['Date'])
pd.concat([df,M],axis=1)
ID Date Unit_sold_8 Unit_sold_9 Unit_sold_10 Unit_sold_11
Unit_sold_12 Mean
0 1 2019-08-01 12 0 12 0 21 9.00
1 2 2019-09-01 0 23 24 0 22 17.25
2 3 2019-10-23 0 0 35 44 17 32.00
3 4 2019-11-12 0 0 0 56 75 65.50
4 5 2019-11-30 0 0 0 82 63 72.50
我想计算基于日期的每个ID的平均销售额。例如,如果ID的开放日期是9月,那么该ID的平均销售将从9月开始。我尝试了np。选择,但我意识到这种方法将使我的代码变得超长
col = df.columns
mask1 = (df['Date'] >= "08/01/2019") & (df['Date'] < "09/01/2019")
mask2 = (df['Date'] >= "09/01/2019") & (df['Date'] < "10/01/2019")
mask3 = (df['Date'] >= "10/01/2019") & (df['Date'] < "11/01/2019")
mask4 = (df['Date'] >= "11/01/2019") & (df['Date'] < "12/01/2019")
mask5 = (df['Date'] >= "12/01/2019")
condition2 = [mask1, mask2, mask3, mask4, mask5]
result2 = [df[col[2:]].mean(skipna = True, axis = 1),
df[col[3:]].mean(skipna = True, axis = 1),
df[col[4:]].mean(skipna = True, axis = 1),
df[col[5:]].mean(skipna = True, axis = 1),
df[col[6:]].mean(skipna = True, axis = 1)]
df.loc[:, 'Mean'] = np.select(condition2, result2, default = np.nan)
col=df.columns
mask1=(df['Date']>=“2019年1月8日”)和(df['Date']<“2019年1月9日”)
mask2=(df['Date']>=“2019年1月9日”)和(df['Date']<“2019年1月10日”)
mask3=(df['Date']>=“2019年1月10日”)和(df['Date']<“2019年1月11日”)
mask4=(df['Date']>=“2019年1月11日”)和(df['Date']<“2019年1月12日”)
mask5=(df['Date']>=“2019年1月12日”)
条件2=[mask1,mask2,mask3,mask4,mask5]
结果2=[df[col[2:].平均值(skipna=True,axis=1),
df[col[3:].平均值(skipna=True,axis=1),
df[col[4:].平均值(skipna=True,axis=1),
df[col[5:].平均值(skipna=True,axis=1),
df[col[6:].平均值(skipna=True,axis=1)]
df.loc[:,'Mean']=np.select(条件2,结果2,默认值=np.nan)
有没有更快的办法解决这个问题?特别是当时间范围扩大时(12个月、24个月等等)这对你有帮助吗
from datetime import datetime
import numpy as np
from dateutil import relativedelta
check_date = datetime.today()
df['n_months'] = df['Date'].apply(lambda x: relativedelta.relativedelta( check_date,x).months)
df['total'] = df.iloc[:,range(2,df.shape[1]-1)].sum(axis=1)
df['avg'] = df['total'] / df['n_months']
print(df)
ID Date Unit_sold_8 ... n_months total avg
0 1 2019-08-01 12 ... 5 45 9.00
1 2 2019-09-01 0 ... 4 69 17.25
2 3 2019-10-23 0 ... 3 96 32.00
3 4 2019-11-12 0 ... 2 131 65.50
4 5 2019-11-30 0 ... 2 145 72.50
这对你有帮助吗
from datetime import datetime
import numpy as np
from dateutil import relativedelta
check_date = datetime.today()
df['n_months'] = df['Date'].apply(lambda x: relativedelta.relativedelta( check_date,x).months)
df['total'] = df.iloc[:,range(2,df.shape[1]-1)].sum(axis=1)
df['avg'] = df['total'] / df['n_months']
print(df)
ID Date Unit_sold_8 ... n_months total avg
0 1 2019-08-01 12 ... 5 45 9.00
1 2 2019-09-01 0 ... 4 69 17.25
2 3 2019-10-23 0 ... 3 96 32.00
3 4 2019-11-12 0 ... 2 131 65.50
4 5 2019-11-30 0 ... 2 145 72.50
连接回原始数据帧:
a = [1, 2, 3, 4, 5]
b = ['2019-08-01', '2019-09-01', '2019-10-23', '2019-11-12', '2019-11-30']
c = [12, 0, 0, 0, 0]
d = [0, 23, 0, 0, 0]
e = [12, 24, 35, 0, 0]
f = [0, 0, 44, 56, 82]
g = [21, 22, 17, 75, 63]
df = pd.DataFrame({'ID': a, 'Date': b, 'Unit_sold_8': c,
'Unit_sold_9': d, 'Unit_sold_10': e, 'Unit_sold_11': f,
'Unit_sold_12': g})
df['Date'] = pd.to_datetime(df['Date'])
pd.concat([df,M],axis=1)
ID Date Unit_sold_8 Unit_sold_9 Unit_sold_10 Unit_sold_11
Unit_sold_12 Mean
0 1 2019-08-01 12 0 12 0 21 9.00
1 2 2019-09-01 0 23 24 0 22 17.25
2 3 2019-10-23 0 0 35 44 17 32.00
3 4 2019-11-12 0 0 0 56 75 65.50
4 5 2019-11-30 0 0 0 82 63 72.50
连接回原始数据帧:
a = [1, 2, 3, 4, 5]
b = ['2019-08-01', '2019-09-01', '2019-10-23', '2019-11-12', '2019-11-30']
c = [12, 0, 0, 0, 0]
d = [0, 23, 0, 0, 0]
e = [12, 24, 35, 0, 0]
f = [0, 0, 44, 56, 82]
g = [21, 22, 17, 75, 63]
df = pd.DataFrame({'ID': a, 'Date': b, 'Unit_sold_8': c,
'Unit_sold_9': d, 'Unit_sold_10': e, 'Unit_sold_11': f,
'Unit_sold_12': g})
df['Date'] = pd.to_datetime(df['Date'])
pd.concat([df,M],axis=1)
ID Date Unit_sold_8 Unit_sold_9 Unit_sold_10 Unit_sold_11
Unit_sold_12 Mean
0 1 2019-08-01 12 0 12 0 21 9.00
1 2 2019-09-01 0 23 24 0 22 17.25
2 3 2019-10-23 0 0 35 44 17 32.00
3 4 2019-11-12 0 0 0 56 75 65.50
4 5 2019-11-30 0 0 0 82 63 72.50
我在看你的计算——我得到第一行的平均值是9,但下一行是17.25?是不是应该是13.8?啊,因为在第二行,ID的开放日期是9月,所以平均值将包括9到12(包括0)的单位sold。在我的例子中,第二行的结果=(23+24+0+22)/4=17.25我在看ur的计算-我得到第一行的平均值是9,但下一行是17.25?是不是应该是13.8?啊,因为在第二行,ID的开放日期是9月,所以平均值将包括9到12(包括0)的单位sold。在我的例子中,第二行的结果=(23+24+0+22)/4=17.25对不起,我需要的结果已经在帖子中了,你可以运行并检查它我不理解你的代码-如果id-1从2019-08-01开始,总数是51,你如何计算平均值?在第一行,第一个id的平均值=(12+0+12+0+21)/5。在你的代码中,你添加了6,所以这不是我的意思。对不起,我需要的结果已经在帖子中了,你可以运行并检查它。我不理解你的代码-如果id-1从2019-08-01开始,总数是51,你如何计算平均值?在第一行,第一个id的平均值=(12+0+12+0+21)/5。在代码中添加6,所以这不是我的意思。