计算 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 数据框目前会忽略具有日期时间序列的列。
我有一个日期时间属性:
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 数据框目前会忽略具有日期时间序列的列。