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), используя количество дней в качестве весов.

Как я могу получить количество дней между датой начала и датой окончания? Насколько я читал, это форматирование дд/мм/гггг не будет распознаваться как дата?

Если у меня есть это количество дней в интервале, как рассчитать средневзвешенное значение?


person Elsalex    schedule 19.08.2015    source источник


Ответы (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

Вуаля

person YOBA    schedule 19.08.2015
comment
Спасибо за ответ. Ваше решение почти работает, но не полностью. Действительно, может возникнуть переполнение при вычислении ( (df.DateEnd - df.DateStart + datetime.timedelta(1))* df.Price), результатом которого является количество дней. Например, если 170 дней и цена 619, я получаю в результате 105230, что нормально, но если цена 640, я получаю в результате -104024! Что-то нужно изменить, чтобы указать, что Days*Price не имеет единиц измерения. Является ли это возможным? - person Elsalex; 20.08.2015
comment
В результате я могу получить отрицательные средние значения для положительных цен. - person Elsalex; 20.08.2015
comment
@Elsalex Вы правы, я только что внес изменения, это должно сработать, дайте мне знать. - person YOBA; 20.08.2015
comment
Теперь работает нормально! Мерси красавчик! - person Elsalex; 20.08.2015

Вы можете передать 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
person chrisb    schedule 19.08.2015