Python/pandas:使用日期差异的列值的加权平均值
Python/pandas: weighted mean of column values using dates difference
我有一个数据框,我使用 read_csv()
导入它,它的两列是日期('StartDate' 和 'EndDate'),日期格式为 dd/mm/yyyy。另一列包含可能的每日价格 ('Price')。
一个(非常小的)提取物看起来像:
DateStart DateEnd Price
01/01/2015 31/01/2015 100
01/01/2015 02/01/2015 10
我需要计算平均每日价格,在此处:(31*100+2*10)/(31+2)
,使用天数作为权重。
如何获取开始日期和结束日期之间的天数?据我所知,这种格式 dd/mm/yyyy 不会被识别为日期?
一旦我有了这个间隔天数,如何计算加权平均值?
您可以将 dayfirst=True
传递给 to_datetime
来解析这些日期。然后就可以计算差值,计算加权平均了。
In [82]: for c in ['DateStart','DateEnd']:
...: df[c] = pd.to_datetime(df[c], dayfirst=True)
In [87]: df['day_diff'] = (df['DateEnd'] - df['DateStart']).dt.days + 1
In [88]: df['Price'].dot(df['day_diff']) / df['day_diff'].sum()
Out[88]: 94
import datetime, pandas as pd, numpy as np
- 首先,定义您在 csv 中的日期格式
dateparse = lambda x: pd.datetime.strptime(x, '%d/%m/%Y')
- 然后阅读并指定日期列
df = pd.read_csv("file.csv", parse_dates=['DateStart','DateEnd'], date_parser=dateparse)
- 这是你的结果:
number_of_days = ( (df.DateEnd - df.DateStart + datetime.timedelta(1) ) / np.timedelta64(1, 'D'))
result = ( number_of_days * df.Price ).sum() / number_of_days.sum()
print result
瞧
我有一个数据框,我使用 read_csv()
导入它,它的两列是日期('StartDate' 和 'EndDate'),日期格式为 dd/mm/yyyy。另一列包含可能的每日价格 ('Price')。
一个(非常小的)提取物看起来像:
DateStart DateEnd Price
01/01/2015 31/01/2015 100
01/01/2015 02/01/2015 10
我需要计算平均每日价格,在此处:(31*100+2*10)/(31+2)
,使用天数作为权重。
如何获取开始日期和结束日期之间的天数?据我所知,这种格式 dd/mm/yyyy 不会被识别为日期?
一旦我有了这个间隔天数,如何计算加权平均值?
您可以将 dayfirst=True
传递给 to_datetime
来解析这些日期。然后就可以计算差值,计算加权平均了。
In [82]: for c in ['DateStart','DateEnd']:
...: df[c] = pd.to_datetime(df[c], dayfirst=True)
In [87]: df['day_diff'] = (df['DateEnd'] - df['DateStart']).dt.days + 1
In [88]: df['Price'].dot(df['day_diff']) / df['day_diff'].sum()
Out[88]: 94
import datetime, pandas as pd, numpy as np
- 首先,定义您在 csv 中的日期格式
dateparse = lambda x: pd.datetime.strptime(x, '%d/%m/%Y')
- 然后阅读并指定日期列
df = pd.read_csv("file.csv", parse_dates=['DateStart','DateEnd'], date_parser=dateparse)
- 这是你的结果:
number_of_days = ( (df.DateEnd - df.DateStart + datetime.timedelta(1) ) / np.timedelta64(1, 'D'))
result = ( number_of_days * df.Price ).sum() / number_of_days.sum()
print result
瞧