计算 python 日期时间的平均值

computing the mean for python 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)

我想计算该属性的平均值。 运行 mean() 导致错误:

TypeError: reduction operation 'mean' not allowed for this dtype

我也尝试了建议的解决方案 。它不起作用,因为 运行 那里提出的功能导致

OverflowError: Python int too large to convert to C long

你会提出什么建议?上述数据帧的结果应等同于

datetime.datetime(2014, 7, 12).

日期时间数学支持一些标准操作:

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!

如果需要,您可以使用 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')

可以取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()

我使用纪元 pd.Timestamp(0) 而不是 min

df_test.DOB.pipe(lambda d: (lambda m: m + (d - m).mean())(pd.Timestamp(0))).to_pydatetime()

您可以使用 astype 和 np.int64 转换纪元时间,并使用 pd.to_datetime:

转换回日期时间
pd.to_datetime(df_test.DOB.dropna().astype(np.int64).mean())

输出:

Timestamp('2014-07-12 00:00:00')

从 pandas=0.25 开始,可以计算日期时间序列的平均值。

In [1]: import pandas as pd
   ...: import numpy as np

In [2]: s = pd.Series([
   ...:     pd.datetime(2014, 7, 9),
   ...:     pd.datetime(2014, 7, 15),
   ...:     np.datetime64('NaT')])

In [3]: s.mean()
Out[3]: Timestamp('2014-07-12 00:00:00')

但是,请注意,将均值应用于 pandas 数据框目前会忽略具有日期时间序列的列。