具有 pandas 均值函数的日期时间对象

Datetime objects with pandas mean function

我是编程新手,所以如果这个问题没有任何意义,我提前道歉。 我注意到,当我尝试使用格式如下的日期时间对象计算 pandas 数据框的平均值时:datetime.datetime(2014, 7, 10),它无法计算平均值然而,它似乎能够毫无问题地计算出同一数据帧的最小值和最大值。

d={'one' : Series([1, 2, 3], index=['a', 'b', 'c']), 'two' :Series([datetime.datetime(2014, 7, 9) , datetime.datetime(2014, 7, 10) , datetime.datetime(2014, 7, 11) ], index=['a', 'b', 'c'])}
df=pd.DataFrame(d)

df
Out[18]: 
      one        two    
   a    1 2014-07-09
   b    2 2014-07-10
   c    3 2014-07-11

df.min()
Out[19]: 
   one             1
   two    2014-07-09
dtype: object

df.mean()
Out[20]: 
   one    2
dtype: float64

我确实注意到 min 和 max 函数将所有列转换为对象,而 mean 函数只输出浮点数。 谁能给我解释一下为什么 mean 函数只能处理浮点数? 还有另一种方法可以获取带有日期时间对象的数据框的平均值吗? 我可以通过使用纪元时间(作为整数)来解决它,但如果有直接的方法会非常方便。我用 Python 2.7

我很感激任何提示。

您可以使用datetime.timedelta

import functools
import operator
import datetime

import pandas as pd

d={'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']), 'two' :pd.Series([datetime.datetime(2014, 7, 9) , datetime.datetime(2014, 7, 10) , datetime.datetime(2014, 7, 11) ], index=['a', 'b', 'c'])}
df = pd.DataFrame(d)

def avg_datetime(series):
    dt_min = series.min()
    deltas = [x-dt_min for x in series]
    return dt_min + functools.reduce(operator.add, deltas) / len(deltas)

print(avg_datetime(df['two']))

为了简化 Alex 的回答(我会把它添加为评论,但我没有足够的声誉):

import datetime
import pandas as pd

d={'one': pd.Series([1, 2, 3], index=['a', 'b', 'c']), 
   'two': pd.Series([datetime.datetime(2014, 7, 9), 
           datetime.datetime(2014, 7, 10), 
           datetime.datetime(2014, 7, 11) ], 
           index=['a', 'b', 'c'])}
df = pd.DataFrame(d)

看起来像:

   one   two
a   1   2014-07-09
b   2   2014-07-10
c   3   2014-07-11

然后计算第 "two" 列的平均值:

(df.two - df.two.min()).mean() + df.two.min()

因此,减去时间序列的最小值,计算生成的时间增量的平均值(或中值),然后加回最小值。

此问题已在 pandas=0.25 中得到解决。但是 mean 目前只能应用于日期时间系列,而不是 DataFrame 中的日期时间系列。

In [1]: import pandas as pd

In [2]: s = pd.Series([pd.datetime(2014, 7, 9), 
   ...:            pd.datetime(2014, 7, 10), 
   ...:            pd.datetime(2014, 7, 11)])

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

将 .mean() 应用于包含日期时间序列的 DataFrame returns 与原始问题中显示的结果相同。

In [4]: df = pd.DataFrame({'numeric':[1,2,3],
   ...:               'datetime':s})

In [5]: df.mean()
Out[5]: 
numeric    2.0
dtype: float64