美国国家海洋和大气管理局降雨数据显示多年来每小时平均值的蟒蛇和大熊猫

时间:2017-09-01 19:01:40

标签: python pandas noaa

我是堆叠溢出和熊猫的新手,但我很欣赏这个平台,并且有一个有趣的问题:我有一个pandas数据框,它接受NOAA降雨量数据(csv格式表示有降雨的小时数,不同年份但是顺序,一些数据缺失),用零替换NaNs,并为NOAA提供的所有年份的水/管道工程师提供干净的每小时数据文件(完全不同)。但是,工程师想要一个8760(非闰年的小时数)小时数据文件,它是NOAA每年每小时的平均值。

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

1 个答案:

答案 0 :(得分:0)

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

  1. 使用日期时间列的月,日,小时在df中创建一列
  2. 使用groupby方法创建分组行的映射
  3. 计算这些群体的平均值
  4. 这是一个创建虚拟数据集&计算每组的平均值:

    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()