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
  1. Сначала определите формат даты, который у вас есть в вашем CSV
dateparse = lambda x: pd.datetime.strptime(x, '%d/%m/%Y')
  1. Затем прочитайте его и укажите столбцы даты
df = pd.read_csv("file.csv", parse_dates=['DateStart','DateEnd'], date_parser=dateparse)
  1. И вот ваш результат:
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
Другие вопросы по тегам