Pandas / Python – 按时间段分组数据

前端之家收集整理的这篇文章主要介绍了Pandas / Python – 按时间段分组数据前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我有一些财务数据,并希望只获得特定时间段(小时,天,月……)的最后一笔交易.

例:

  1. >>df
  2. time price_BRL qt time_dt
  3. 1312001297 23.49 1.00 2011-07-30 04:48:17
  4. 1312049148 23.40 1.00 2011-07-30 18:05:48
  5. 1312121523 23.49 2.00 2011-07-31 14:12:03
  6. 1312121523 23.50 6.50 2011-07-31 14:12:03
  7. 1312177622 23.40 2.00 2011-08-01 05:47:02
  8. 1312206416 23.25 1.00 2011-08-01 13:46:56
  9. 1312637929 18.95 1.50 2011-08-06 13:38:49
  10. 1312637929 18.95 4.00 2011-08-06 13:38:49
  11. 1312817114 0.80 0.01 2011-08-08 15:25:14
  12. 1312818289 0.10 0.01 2011-08-08 15:44:49
  13. 1312819795 6.00 0.09 2011-08-08 16:09:55
  14. 1312847064 16.00 0.86 2011-08-08 23:44:24
  15. 1312849282 16.00 6.14 2011-08-09 00:21:22
  16. 1312898146 19.90 1.00 2011-08-09 13:55:46
  17. 1312915666 6.00 0.01 2011-08-09 18:47:46
  18. 1312934897 19.90 1.00 2011-08-10 00:08:17
  19. >>filter_by_last_day(df)
  20. time price_BRL qt time_dt
  21. 1312049148 23.40 1.00 2011-07-30 18:05:48
  22. 1312121523 23.50 6.50 2011-07-31 14:12:03
  23. 1312206416 23.25 1.00 2011-08-01 13:46:56
  24. 1312637929 18.95 4.00 2011-08-06 13:38:49
  25. 1312847064 16.00 0.86 2011-08-08 23:44:24
  26. 1312915666 6.00 0.01 2011-08-09 18:47:46
  27. 1312934897 19.90 1.00 2011-08-10 00:08:17

我正在考虑使用groupby()并获得当天的平均值()这个解决方案也可以解决我的问题,但不完全正确)但不知道如何选择df.groupby这样的日子(‘time.day ‘).持续()

最佳答案
您可以在dt.date之前使用groupby并在last之前聚合:

  1. #if necessery convert to datetime
  2. df.time_dt = pd.to_datetime(df.time_dt)
  3. df = df.groupby(df.time_dt.dt.date).last().reset_index(drop=True)
  4. print (df)
  5. time price_BRL qt time_dt
  6. 0 1312049148 23.40 1.00 2011-07-30 18:05:48
  7. 1 1312121523 23.50 6.50 2011-07-31 14:12:03
  8. 2 1312206416 23.25 1.00 2011-08-01 13:46:56
  9. 3 1312637929 18.95 4.00 2011-08-06 13:38:49
  10. 4 1312847064 16.00 0.86 2011-08-08 23:44:24
  11. 5 1312915666 6.00 0.01 2011-08-09 18:47:46
  12. 6 1312934897 19.90 1.00 2011-08-10 00:08:17

谢谢MaxU的另一个解决方案 – 为返回DataFrame添加参数as_index = False:

  1. df = df.groupby(df.time_dt.dt.date,as_index=False).last()
  2. print (df)
  3. time price_BRL qt time_dt
  4. 0 1312049148 23.40 1.00 2011-07-30 18:05:48
  5. 1 1312121523 23.50 6.50 2011-07-31 14:12:03
  6. 2 1312206416 23.25 1.00 2011-08-01 13:46:56
  7. 3 1312637929 18.95 4.00 2011-08-06 13:38:49
  8. 4 1312847064 16.00 0.86 2011-08-08 23:44:24
  9. 5 1312915666 6.00 0.01 2011-08-09 18:47:46
  10. 6 1312934897 19.90 1.00 2011-08-10 00:08:17

使用resample解决方案,但必须在dropna之前删除NaN行:

  1. df = df.resample('d',on='time_dt').last().dropna(how='all').reset_index(drop=True)
  2. #cast column time to int
  3. df.time = df.time.astype(int)
  4. print (df)
  5. time price_BRL qt time_dt
  6. 0 1312049148 23.40 1.00 2011-07-30 18:05:48
  7. 1 1312121523 23.50 6.50 2011-07-31 14:12:03
  8. 2 1312206416 23.25 1.00 2011-08-01 13:46:56
  9. 3 1312637929 18.95 4.00 2011-08-06 13:38:49
  10. 4 1312847064 16.00 0.86 2011-08-08 23:44:24
  11. 5 1312915666 6.00 0.01 2011-08-09 18:47:46
  12. 6 1312934897 19.90 1.00 2011-08-10 00:08:17

你也可以使用dt.month

  1. df = df.groupby(df.time_dt.dt.month).last().reset_index(drop=True)
  2. print (df)
  3. time price_BRL qt time_dt
  4. 0 1312121523 23.5 6.5 2011-07-31 14:12:03
  5. 1 1312934897 19.9 1.0 2011-08-10 00:08:17

有几个小时它有点复杂,如果需要groupby按日期和小时一起,解决方案是用astype将分钟和秒数替换为0:

  1. hours = df.time_dt.values.astype('

猜你在找的Python相关文章