Python/Pandas—日期时间统计信息。如何聚合datetime列的平均值

Python/Pandas—日期时间统计信息。如何聚合datetime列的平均值,python,pandas,numpy,datetime,aggregate,Python,Pandas,Numpy,Datetime,Aggregate,我目前正在为我的数据分析编写一个“Split-Apply-Combine”管道,其中还包括日期。以下是一些示例数据: In [1]: import pandas as pd import numpy as np import datetime as dt startdate = np.datetime64("2018-01-01") randdates = np.random.randint(1, 365, 100) + startdate df = pd.DataFrame({'Type'

我目前正在为我的数据分析编写一个“Split-Apply-Combine”管道,其中还包括日期。以下是一些示例数据:

In [1]:
import pandas as pd
import numpy as np
import datetime as dt

startdate = np.datetime64("2018-01-01")
randdates = np.random.randint(1, 365, 100) + startdate

df = pd.DataFrame({'Type': np.random.choice(['A', 'B', 'C'], 100), 
                   'Metric': np.random.rand(100), 
                   'Date': randdates})
df.head()

Out[1]: 
  Type    Metric       Date
0    A  0.442970 2018-08-02
1    A  0.611648 2018-02-11
2    B  0.202763 2018-03-16
3    A  0.295577 2018-01-09
4    A  0.895391 2018-11-11
现在,我想通过
'Type'
进行聚合,并获得各个变量的汇总统计信息。这对于像
'Metric'
这样的数值变量很容易:

df.groupby('Type')['Metric'].agg(('mean', 'std'))
然而,对于datetime对象,计算平均值、标准偏差或其他统计数据实际上没有意义,并且会抛出错误。我需要此操作的上下文是,我正在基于某个距离度量对日期进行建模。当我用随机抽样(monte-carlo模拟)重复这个建模时,我稍后想重新分配建模日期的平均值和置信区间

所以我的问题是:用datetime数据可以建立什么有用的统计数据?如何表示建模日期的统计分布?如何实现聚合操作

我的理想输出是获得一个
Date\u mean
Date\u stdev
列,表示我的建模日期范围。

您可以使用时间戳(Unix)

Epoch,也称为Unix时间戳,是自1970年1月1日00:00:00 GMT(1970-01-01 00:00 GMT)以来经过的秒数(不是毫秒!)

您可以将所有日期转换为时间戳,如下所示:

import time
import datetime
d = "2018-08-02"
time.mktime(datetime.datetime.strptime(d, "%Y-%m-%d").timetuple()) #1533160800

从那里你可以计算你需要什么。

你可以考虑使用时间增量。直观地说,“5天的平均值+/-半天的标准偏差”听起来比“2019年5月5日的平均值”更合理。在你的情况下,时间并不是一个真正的因变量,你希望你的汇总统计数据能告诉你什么?这是真的。我正在根据距离测量重建日历日期。想象一下树木的年轮,根据树木的生长速度,年轮越宽越窄。最后,我想说“8毫米的增长相当于24+-2天”——这在时间增量中是可能的。但考虑到夏季增长较快,冬季增长较慢,我可能需要说“从2018年7月10日起,它增长了18毫米,相当于176+-12天,等于2019年4月11日“因此,时间是这里的依赖变量,因为我在上一步基于生长距离(
metric
)、一些化学分析、预测和dtw对其进行了建模……我想要的统计数据的另一种说法可能是“在4月3日,样本生长0.4mm+-0.001mm”,或者“自2018年4月4日的最后一次测量以来,样本增长了4 mm,因此在这次测量中,它必须是2018年5月8日+-3天”。我根据生长/距离是已知的,日期/时间是未知的,重建了生长/日期相关性。请不要在评论中写下答案:)