【问题标题】:python and pandas for annual hourly averages over many years for NOAA rainfall data对于 NOAA 降雨数据,python 和 pandas 多年来的年平均小时数
【发布时间】:2018-02-10 21:18:57
【问题描述】:

我是堆栈溢出和熊猫的新手,但我很欣赏这个平台并有一个有趣的问题:我有一个熊猫数据框,它采用 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 开始的所有年份的平均值)请记住数据的开始和闰年!任何见解如何成功地做到这一点?

【问题讨论】:

  • 欢迎您!请查看stackoverflow.com/help/mcve 以更好地格式化此问题,以便社区可以帮助您。发布代码示例、错误消息和更多详细信息,以便我们为您提供帮助!

标签: python pandas noaa


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    • 2020-05-16
    • 2019-09-23
    相关资源
    最近更新 更多