0

我是堆栈溢出和熊猫的新手,但我很欣赏这个平台并有一个有趣的问题:我有一个熊猫数据框,它采用 NOAA 降雨数据(以 csv 格式表示有降雨的时间,不同年份但连续,一些数据缺失),用零替换 NaN,并为我们的水/管道工程师提供一个干净的每小时数据文件,这些文件可以从 NOAA 获得(完全不同)。但是,工程师想要一个 8760(非闰年的小时数)小时数据文件,它是 NOAA 提供的每一年中每小时的平均值。

例如,我有从 1987 年 7 月 1 日凌晨 1:00 到 2001 年 12 月 31 日凌晨 12:00 的每小时 NOAA 数据;我制作了一个巨大的每小时 df,但现在我需要制作一个每年 8760 小时的 df,其平均值为一年中每个小时的平均值(所有年份从 1 月 1 日凌晨 1:00 开始的平均值,从 1 月 1 日凌晨 2:00 开始的平均值在所有年份,...,从 12 月 31 日凌晨 12:00 开始的所有年份的平均值)请记住数据的开始和闰年!任何见解如何成功地做到这一点?

4

1 回答 1

0

Pandas 非常适合这类事情。你需要做的是:

  1. 在您的 df 中创建一个列,其中包含 datetime 列的月、日、小时
  2. 使用该groupby方法创建分组行的映射
  3. 计算这些组的平均值

这是一个片段,它创建一个虚拟数据集并计算每个组的平均值:

import pandas as pd
import numpy as np

#creating some dummy data
n_years = 3
n_hours = 3
st_times = ['01-01-198{0} 00:00'.format(i) for i in range(n_years)]
nd_times = ['01-01-198{0} 0{1}:00'.format(i,n_hours-1) for i in range(n_years)]

indx_list = []
for s, e in zip(st_times, nd_times):
    indx = pd.date_range(start=s, end=e, freq='H')
    indx_list.append(indx.values)
index = pd.DatetimeIndex(np.concatenate(indx_list,axis=0))

data = pd.DataFrame({'rainfall': list(range(n_years*n_hours)),
              'rainfall_1': list(reversed(range(n_years*n_hours)))
             }, index=index)

#creating the hour, day, month, & day columns
data.loc[:,'hour'] = data.index.hour.values
data.loc[:,'day'] = data.index.day.values
data.loc[:,'month'] = data.index.month.values

#create groups and calculate the mean of each group
data.groupby(['month','day','hour']).mean()
于 2017-09-02T15:20:13.747 回答