2015-08-19 45 views
1

我有一個數據框,我使用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不會被識別爲日期嗎?

一旦我有這段天數的區間,如何計算加權平均值?

回答

1
import datetime, pandas as pd, numpy as np 
  1. 首先,定義您的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 
    

    +0

    什麼是不工作? – YOBA

    +0

    謝謝你的回答。您的解決方案几乎可行,但不完全。事實上,通過計算'((df.DateEnd - df.DateStart + datetime.timedelta(1))* df.Price)',可能會出現某種溢出,其結果在這裏有好幾天。例如,如果170天和價格是619,我得到105230結果,這是好的,但如果價格是640,我得到-104024!應該更改某些內容以指定Days * Price無單位。可能嗎? – Elsalex

    +0

    因此,我可以得到一些積極的價格的負平均值。 – Elsalex

    2

    您可以通過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