Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在timestamp/datetime/datetime64类型的列上运行groupby时,如何正确使用pandas agg函数?_Python_Datetime_Pandas_Count_Aggregate - Fatal编程技术网

Python 在timestamp/datetime/datetime64类型的列上运行groupby时,如何正确使用pandas agg函数?

Python 在timestamp/datetime/datetime64类型的列上运行groupby时,如何正确使用pandas agg函数?,python,datetime,pandas,count,aggregate,Python,Datetime,Pandas,Count,Aggregate,我试图理解为什么直接对一个组调用count()会返回正确的答案(在本例中,该组中有两行),但通过agg()函数中的lambda调用count()会返回新纪元的开始(“1970-01-01 00:00:00.00000000 2”) 这可能是熊猫身上的虫子吗?我正在使用 熊猫版本:0.16.1 IPython版本:3.1.0 numpy版本:1.9.2 无论我使用的是标准python datetime还是np.datetime64还是pandas时间戳,我都会得到相同的结果 EDIT(根据@jef

我试图理解为什么直接对一个组调用count()会返回正确的答案(在本例中,该组中有两行),但通过agg()函数中的lambda调用count()会返回新纪元的开始(“1970-01-01 00:00:00.00000000 2”)

这可能是熊猫身上的虫子吗?我正在使用 熊猫版本:0.16.1 IPython版本:3.1.0 numpy版本:1.9.2

无论我使用的是标准python datetime还是np.datetime64还是pandas时间戳,我都会得到相同的结果

EDIT(根据@jeff接受的答案,在应用不返回日期时间类型的聚合函数之前,我可能需要强制使用dtype对象):


这里的x是上面的原始帧(与groupby无关)。传递一个UDF,例如lambda,在每个系列上调用它。这是函数的结果

In [35]: x.count()
Out[35]: 
time    2
dtype: int64
然后强制执行序列的原始数据类型。因此,结果是:

In [36]: Timestamp(2)
Out[36]: Timestamp('1970-01-01 00:00:00.000000002')

这正是你所看到的。强制原始数据类型的目的是尽可能保留它。如果不这样做,groupby结果会更神奇。

谢谢,这是有道理的。如果我将datetime64强制为dtype对象,那么它将按预期聚合。这是处理这个问题最合理的方法吗?用这种方式强制转换到对象可能会损失一些性能,但我不确定什么是好的替代方案。那么,你在做什么?从具有
datetime64[ns]
的groupby。我想不出有多少是我们还没有定义的(或者您将首先对框架进行操作并执行一些操作)。我正在检查缺少值的行,但没有用于该行的函数,因此我必须执行(len-count()),因此我将函数列表传递给agg()。例如x.groupby(lambda x:True).agg(['count',len])。如果我将列类型保留为datetime,len函数的输出将强制为datetime。或者,我可以在返回自定义聚合函数之前将其输出转换为浮点数(此时Panda不会尝试强制将其转换为datetime),并且
df.isnull()
不会为您这样做吗?这是非常奇怪的groupby上的一切,并做这样的计数。
In [35]: x.count()
Out[35]: 
time    2
dtype: int64
In [36]: Timestamp(2)
Out[36]: Timestamp('1970-01-01 00:00:00.000000002')