Python在datetime列上使用groupby agg函数

Python在datetime列上使用groupby agg函数,python,numpy,pandas,null,aggregate,Python,Numpy,Pandas,Null,Aggregate,pandas 0.17.1和numpy 1.10.1中的.agg()函数存在一些虚假行为。这个问题可以在一些数据类型转换中找到。以下是一个数据帧示例: import datetime as dt df_data = [[1,1,2] , ['foo', 'bar', 'bar'], [1,2,3] , [dt.date(2015,1,5), dt.date(2015,1,3), dt.date(2015,1,15)] , [dt.datetime(2015,1,5,23

pandas 0.17.1和numpy 1.10.1中的
.agg()
函数存在一些虚假行为。这个问题可以在一些数据类型转换中找到。以下是一个数据帧示例:

import datetime as dt

df_data = [[1,1,2]
    , ['foo', 'bar', 'bar'], [1,2,3]
    , [dt.date(2015,1,5), dt.date(2015,1,3), dt.date(2015,1,15)]
    , [dt.datetime(2015,1,5,23,16,59), dt.datetime(2015,1,5,21,16,59)
    , dt.datetime(2015,1,5,20,16,59)]
    , [dt.timedelta(minutes=60), dt.timedelta(minutes=120), dt.timedelta(minutes=12)]]

df_cols = ['gb', 'a_string', 'a_int', 'a_date', 'a_datetime', 'a_timedelta']

df = pd.DataFrame({i:j for i,j in zip(df_cols, df_data)})

print(df[df_cols])
df_data = [[1,1,2]
    , ['foo', 'bar', 'bar'], [1,2,3]
    , [dt.date(2015,1,5), dt.date(2015,1,3), dt.date(2015,1,15)]
    , [pd.NaT, pd.NaT
    , dt.datetime(2015,1,5,20,16,59)]
    , [dt.timedelta(minutes=60), dt.timedelta(minutes=120), dt.timedelta(minutes=12)]]

df_cols = ['gb', 'a_string', 'a_int', 'a_date', 'a_datetime', 'a_timedelta']

df = pd.DataFrame({i:j for i,j in zip(df_cols, df_data)})

print(df[df_cols])
结果是:

   gb a_string  a_int      a_date          a_datetime  a_timedelta
0   1      foo      1  2015-01-05 2015-01-05 23:16:59     01:00:00
1   1      bar      2  2015-01-03 2015-01-05 21:16:59     02:00:00
2   2      bar      3  2015-01-15 2015-01-05 20:16:59     00:12:00
   gb a_string  a_int      a_date          a_datetime  a_timedelta
0   1      foo      1  2015-01-05                 NaT     01:00:00
1   1      bar      2  2015-01-03                 NaT     02:00:00
2   2      bar      3  2015-01-15 2015-01-05 20:16:59     00:12:00
例如,我想计算
min()
和一些其他统计数据。我可以使用几个来获取我的统计数据(让我们只看
min()
):

结果是正确的:

   a_string  a_int      a_date          a_datetime  a_timedelta
gb                                                             
1       bar      1  2015-01-03 2015-01-05 21:16:59     01:00:00
2       bar      3  2015-01-15 2015-01-05 20:16:59     00:12:00
或者我可以使用
agg()
函数,但是使用此函数,在
timedelta
对象处会发生一些数据类型转换错误:

df_g_2 = df.groupby('gb').agg({i:np.min for i in df_cols[1:]})
print(df_g_2[df_cols[1:]])
结果是:

   a_string  a_int      a_date          a_datetime    a_timedelta
gb                                                               
1       bar      1  2015-01-03 2015-01-05 21:16:59  3600000000000
2       bar      3  2015-01-15 2015-01-05 20:16:59   720000000000
如果组中只存在
NaT
值,则在
datetime
对象上也会发生相同的错误。让我们看一个新的数据帧:

import datetime as dt

df_data = [[1,1,2]
    , ['foo', 'bar', 'bar'], [1,2,3]
    , [dt.date(2015,1,5), dt.date(2015,1,3), dt.date(2015,1,15)]
    , [dt.datetime(2015,1,5,23,16,59), dt.datetime(2015,1,5,21,16,59)
    , dt.datetime(2015,1,5,20,16,59)]
    , [dt.timedelta(minutes=60), dt.timedelta(minutes=120), dt.timedelta(minutes=12)]]

df_cols = ['gb', 'a_string', 'a_int', 'a_date', 'a_datetime', 'a_timedelta']

df = pd.DataFrame({i:j for i,j in zip(df_cols, df_data)})

print(df[df_cols])
df_data = [[1,1,2]
    , ['foo', 'bar', 'bar'], [1,2,3]
    , [dt.date(2015,1,5), dt.date(2015,1,3), dt.date(2015,1,15)]
    , [pd.NaT, pd.NaT
    , dt.datetime(2015,1,5,20,16,59)]
    , [dt.timedelta(minutes=60), dt.timedelta(minutes=120), dt.timedelta(minutes=12)]]

df_cols = ['gb', 'a_string', 'a_int', 'a_date', 'a_datetime', 'a_timedelta']

df = pd.DataFrame({i:j for i,j in zip(df_cols, df_data)})

print(df[df_cols])
结果是:

   gb a_string  a_int      a_date          a_datetime  a_timedelta
0   1      foo      1  2015-01-05 2015-01-05 23:16:59     01:00:00
1   1      bar      2  2015-01-03 2015-01-05 21:16:59     02:00:00
2   2      bar      3  2015-01-15 2015-01-05 20:16:59     00:12:00
   gb a_string  a_int      a_date          a_datetime  a_timedelta
0   1      foo      1  2015-01-05                 NaT     01:00:00
1   1      bar      2  2015-01-03                 NaT     02:00:00
2   2      bar      3  2015-01-15 2015-01-05 20:16:59     00:12:00
min()

   a_string  a_int      a_date          a_datetime  a_timedelta
gb                                                             
1       bar      1  2015-01-03                 NaT     01:00:00
2       bar      3  2015-01-15 2015-01-05 20:16:59     00:12:00
但是
agg()
给出了错误的值:

   a_string  a_int      a_date               a_datetime    a_timedelta
gb                                                                    
1       bar      1  2015-01-03                      nan  3600000000000
2       bar      3  2015-01-15 1420489019000000000.0000   720000000000

小心&祝你有美好的一天

你的问题是什么?如果这是一个bug报告,作为一个问题提交不是更好吗?我并不是说这里没有问题,尽管我不知道它是否特别与
agg
两者
df\u g\u 2=df.groupby('gb').agg(“min”)
df\u g\u 2=df.groupby('gb').agg(lambda x:x.min())
使用
agg
并给出您期望的输出