【问题标题】:Resampling grouped data to obtain daily average data using Pandas使用 Pandas 对分组数据进行重采样以获得每日平均数据
【发布时间】:2020-03-14 12:46:31
【问题描述】:

我是 pandas 的新手,当我尝试从数据文件中获取每日平均值时遇到了一些问题。

所以,我的数据结构如下:

                      DATA  ESTACION
DATETIME                           
2020-01-15 00:00:00   175        47
2020-01-15 01:00:00   152        47
2020-01-15 02:00:00   180        47
2020-01-15 03:00:00   132        47
2020-01-15 04:00:00   115        47
...                   ...       ...
2020-03-13 19:00:00    38        16
2020-03-13 20:00:00    53        16
2020-03-13 21:00:00    73        16
2020-03-13 22:00:00    28        16
2020-03-13 23:00:00    22        16

这些是 24 个站点收集的空气污染结果。如您所见,每个站点都会收到每小时的信息。

我正在尝试按车站获取每日平均数据。所以这就是我所做的:

我将所有信息按车站分组

grouped = data.groupby(['ESTACION'])

然后我得到分组数据的每日平均重采样

resampled = grouped.resample('D').mean()

这是我得到的:

                            DATA  ESTACION
ESTACION DATETIME                        
4        2020-01-02   18.250000       4.0
         2020-01-03         NaN       NaN
         2020-01-04         NaN       NaN
         2020-01-05         NaN       NaN
         2020-01-06         NaN       NaN
...                         ...       ...
60       2020-11-29         NaN       NaN
         2020-11-30         NaN       NaN
         2020-12-01         NaN       NaN
         2020-12-02  118.666667      60.0
         2020-12-03   80.833333      60.0

我真的不知道发生了什么,因为我只有 2020-01-15 - 2020-03-13 的数据,它显示了来自其他时间戳和 NaN 结果的信息。

如果您需要其他任何东西来重现此案例,请告诉我。

感谢和问候

【问题讨论】:

  • 如果您将代码的工作版本简化为极简版本,那么人们可以更轻松地对其进行测试并为您提供帮助。
  • 你试过grouped = data.groupby(['ESTACION']).mean()吗?
  • 谢谢@Raf。但我正在寻找每个站点的每日平均值,而不是每个站点的总平均值。

标签: python pandas


【解决方案1】:

输出是预期的,因为resample 总是创建连续的DatetimeIndex

因此可以通过DataFrame.dropna 删除缺失的行:

resampled = grouped.resample('D').mean().dropna()

另一种解决方案是使用Series.dt.date:

data.groupby(['ESTACION', data['DATETIME'].dt.date]).mean()

【讨论】:

  • 谢谢@jezrael。我尝试了这两种解决方案,但我不明白为什么输出会更改 DATETIME 格式。我从 yyyy:mm:dd 开始,然后输出更改为 yyyy:dd:mm
  • @guaremate - 将列转换为日期时间的代码是什么?
  • 我正在使用 pandas.to_datetime(data.DATETIME)
  • @guaremate - 也许pandas.to_datetime(data.DATETIME, dayfirst=True) 工作?
猜你喜欢
  • 1970-01-01
  • 2019-02-10
  • 2019-12-27
  • 1970-01-01
  • 2019-09-17
  • 2021-11-24
  • 1970-01-01
  • 2012-06-06
  • 2012-10-02
相关资源
最近更新 更多