Python在datetime列上使用groupby agg函数
pandas 0.17.1和numpy 1.10.1中的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
.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
并给出您期望的输出