вычисление среднего для даты и времени Python - PullRequest
0 голосов
/ 15 мая 2018

У меня есть атрибут datetime:

d = {
    'DOB': pd.Series([
        datetime.datetime(2014, 7, 9),
        datetime.datetime(2014, 7, 15),
        np.datetime64('NaT')
    ], index=['a', 'b', 'c'])
}
df_test = pd.DataFrame(d)

Я бы хотел вычислить среднее значение для этого атрибута. Выполнение среднего значения () вызывает ошибку:

TypeError: операция сокращения 'mean' не разрешена для этого типа d *

Я также попробовал решение, предложенное в другом месте . Он не работает, так как запуск предложенной функции вызывает

OverflowError: Python int слишком велик для преобразования в C long

Что бы вы предложили? Результат для указанного выше кадра данных должен быть эквивалентен

datetime.datetime(2014, 7, 12).

Ответы [ 4 ]

0 голосов
/ 15 мая 2018

Вы можете преобразовать время эпохи, используя astype с помощью np.int64 и преобразовав обратно в дату и время с помощью pd.to_datetime:

pd.to_datetime(df_test.DOB.dropna().astype(np.int64).mean())

Выход:

Timestamp('2014-07-12 00:00:00')
0 голосов
/ 15 мая 2018

Вы можете работать со unix временем, если хотите. Это определяется как общее количество секунд (например) с 1970-01-01. При этом все ваше время просто плавает, так что очень просто сделать простую математику на столбцах.

import pandas as pd

df_test['unix_time'] = (df_test.DOB - pd.to_datetime('1970-01-01')).dt.total_seconds()

df_test['unix_time'].mean()
#1405123200.0

# You want it in date, so just convert back
pd.to_datetime(df_test['unix_time'].mean(), origin='unix', unit='s')
#Timestamp('2014-07-12 00:00:00')
0 голосов
/ 15 мая 2018

Вы можете взять среднее значение Timedelta.Поэтому найдите минимальное значение и вычтите его из серии, чтобы получить серию Timedelta.Затем возьмите среднее и добавьте его обратно к минимуму.

dob = df_test.DOB
m = dob.min()
(m + (dob - m).mean()).to_pydatetime()

datetime.datetime(2014, 7, 12, 0, 0)

Однолинейный

df_test.DOB.pipe(lambda d: (lambda m: m + (d - m).mean())(d.min())).to_pydatetime()

К @ точке ALollz

Я использую эпоху pd.Timestamp(0) вместо min

df_test.DOB.pipe(lambda d: (lambda m: m + (d - m).mean())(pd.Timestamp(0))).to_pydatetime()
0 голосов
/ 15 мая 2018

Datetime математика поддерживает некоторые стандартные операции:

a = datetime.datetime(2014, 7, 9)
b = datetime.datetime(2014, 7, 15)
c = (b - a)/2

# here c will be datetime.timedelta(3)

a + c
Out[7]: datetime.datetime(2014, 7, 12, 0, 0)

Таким образом, вы можете написать функцию, которая, учитывая две даты, вычитает меньшую форму и добавляет половину разницы к меньшей. Примените эту функцию к вашему фрейму данных и shazam!

...