计算python日期时间的平均值

disbfnqx  于 2023-04-10  发布在  Python
关注(0)|答案(5)|浏览(256)

我有一个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:此数据类型不允许约简运算“mean”
我还尝试了elsewhere的解决方案。它不工作,因为运行那里提出的函数会导致
溢出错误:Python int太大,无法转换为C long
你的建议是什么?上面的 Dataframe 的结果应该相当于

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

nxagd54h1#

你可以取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点
我使用的epoch为pd.Timestamp(0),而不是min

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

nkoocmlb2#

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

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

输出:

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

rsl1atfo3#

如果你愿意的话,你可以使用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')
vsmadaxz

vsmadaxz4#

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

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)

因此,你可以编写一个函数,给定两个日期时间,将较小的日期时间减去较大的日期时间,并将差值的一半加到较小的日期时间。将此函数应用于 Dataframe ,然后shazam!

z5btuh9x

z5btuh9x5#

当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 dataframe应用mean当前会忽略具有datetime序列的列。

相关问题