Ave*_*ina 8 python datetime mean 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
Run Code Online (Sandbox Code Playgroud)
我确实注意到min和max函数将所有列都转换为对象,而平均值函数仅输出浮点数。谁能向我解释为什么均值函数只能处理浮点数?我还有另一种方法来获取带有日期时间对象的数据框的平均值吗?我可以使用纪元时间(整数)来解决它,但是如果有直接方法,它将非常方便。我使用Python 2.7
我很感谢任何提示。
spr*_*ing 10
为了简化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)
Run Code Online (Sandbox Code Playgroud)
看起来像:
one two
a 1 2014-07-09
b 2 2014-07-10
c 3 2014-07-11
Run Code Online (Sandbox Code Playgroud)
然后通过以下方式计算“二”列的平均值:
(df.two - df.two.min()).mean() + df.two.min()
Run Code Online (Sandbox Code Playgroud)
因此,减去时间序列的最小值,计算所得时间增量的平均值(或中位数),然后将最小值相加。
您可以使用datetime.timedelta
import functools
import operator
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)
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']))
Run Code Online (Sandbox Code Playgroud)
这个问题从 pandas=0.25 开始就已经解决了。但是,均值目前只能应用于日期时间系列,而不能应用于 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')
Run Code Online (Sandbox Code Playgroud)
将 .mean() 应用于包含日期时间序列的 DataFrame 会返回与原始问题中所示相同的结果。
In [4]: df = pd.DataFrame({'numeric':[1,2,3],
...: 'datetime':s})
In [5]: df.mean()
Out[5]:
numeric 2.0
dtype: float64
Run Code Online (Sandbox Code Playgroud)