Python/pandas: средневзвешенное значение столбца с использованием разницы дат
У меня есть датафрейм, который я импортирую, используя read_csv()
, чьи два столбца являются датами ('StartDate' и 'EndDate'), с форматом даты дд / мм / гггг. Другой столбец содержит возможные ежедневные цены ("Цена").
(Очень маленький) экстракт выглядит так:
DateStart DateEnd Price
01/01/2015 31/01/2015 100
01/01/2015 02/01/2015 10
Мне нужно рассчитать среднесуточную цену, которая здесь: (31*100+2*10)/(31+2)
, используя количество дней в качестве весов.
Как я могу получить количество дней между начальной и конечной датой? Насколько я прочитал, это форматирование дд / мм / гггг не будет распознано как дата?
Как только я получу это количество дней в интервале, как рассчитать средневзвешенное значение?
2 ответа
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
Вуаля
Вы можете пройти 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