Python /熊猫:使用日期差异的列值的加权平均值

问题描述:

我有一个数据框,我使用read_csv()导入,其中两列是日期('StartDate'和'EndDate'),日期格式为dd/mm/yyyy。另一列包含可能的每日价格('价格')。Python /熊猫:使用日期差异的列值的加权平均值

的(很小)提取物看起来像:

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不会被识别为日期吗?

一旦我有这段天数的区间,如何计算加权平均值?

import datetime, pandas as pd, numpy as np 
  1. 首先,定义您的CSV您的日期格式
dateparse = lambda x: pd.datetime.strptime(x, '%d/%m/%Y') 
  1. 然后阅读并指定日期列
  2. df = pd.read_csv("file.csv", parse_dates=['DateStart','DateEnd'], date_parser=dateparse) 
    
    1. 这里是你的结果:
    2. 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 
      

    开始=>
开始=>
+0

什么是不工作? – YOBA

+0

谢谢你的回答。您的解决方案几乎可行,但不完全。事实上,通过计算'((df.DateEnd - df.DateStart + datetime.timedelta(1))* df.Price)',可能会出现某种溢出,其结果在这里有好几天。例如,如果170天和价格是619,我得到105230结果,这是好的,但如果价格是640,我得到-104024!应该更改某些内容以指定Days * Price无单位。可能吗? – Elsalex

+0

因此,我可以得到一些积极的价格的负平均值。 – Elsalex

您可以通过dayfirst=Trueto_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