【问题标题】:Getting monthly maximums from hourly data从每小时数据中获取每月最大值
【发布时间】:2021-01-17 15:59:51
【问题描述】:

我有一个大型数据集,由过去 14 年中每小时记录的潮位组成,我正在尝试创建一个新数据框,其中包含每个月的最大潮汐值及其相关日期。

所以我需要获取每个月的最大潮汐值以及与之相关的日期。

我有点接近我想要的,但我可以看出某处有错误。

以下是原始数据集的示例:

这是我用来生成输出的语法:

df['Date'] = pd.to_datetime(df['Date'], format = '%Y-%m-%d %H:%M:%S',errors = 'ignore')
ddf = df.groupby(pd.Grouper(key = 'Date',freq = 'M')).max()

这导致我得到这个输出:

起初一切看起来都不错(格式正确),但后来我注意到它只是列出了每个月的最后一天,所以我觉得我在某个地方犯了一个简单的错误。

我是 Python 新手,这是我在这里的第一篇文章,所以如果我的文章的任何部分格式不正确,我提前道歉。

【问题讨论】:

  • 您能否将示例和输出添加为文本而不是图像?如果您可以提供minimal reproducible example,我相信您很快就会得到答复。
  • 它在“日期”列中列出了最后一个日期。是否也在“潮”列中列出了最后一个日期的潮值?
  • 时间是单独的列,还是日期列的一部分?尝试粘贴 df.head().to_dict() 的输出以更好地指示您的数据是什么样的。
  • 我尝试粘贴文本,但它一直弄乱格式并难以阅读,所以我留下了屏幕截图

标签: python pandas


【解决方案1】:

我创建了一些示例数据,以更好地说明我认为您正在尝试做的事情。

然后您可以使用idxmax 获取每个月最大data 值的索引位置,方法是:

df.groupby(pd.Grouper(key='Date', freq='M'))['data'].idxmax()

然后使用 loc 在这些每月最大值上对您的数据框进行子集化(如果您愿意,也可以附加 .set_index('Date') 作为索引)。

np.random.seed(0)
timestamps = pd.DatetimeIndex(start='2020-01-01', end='2020-10-01', freq='1h')
data = np.random.randn(len(timestamps))
df = pd.DataFrame({'Date': timestamps, 'data': data})

monthly_max_vals = df.groupby(
    pd.Grouper(key='Date', freq='M'))['data'].idxmax()

>>> df.loc[monthly_max_vals].reset_index(drop=True)
                 Date      data
0 2020-01-21 14:00:00  2.696224
1 2020-02-13 22:00:00  3.170975
2 2020-03-26 20:00:00  2.929096
3 2020-04-05 14:00:00  2.464322
4 2020-05-09 22:00:00  3.801660
5 2020-06-08 10:00:00  2.600672
6 2020-07-23 13:00:00  2.979976
7 2020-08-23 16:00:00  2.841767
8 2020-09-30 17:00:00  2.944984
9 2020-10-01 00:00:00  0.817049

【讨论】:

  • 请问为什么会输出每日最大值?有什么我可以通过的可以达到每月最大值的吗?这让我更接近我需要的东西,我现在需要获取每个月的最大值以及与之关联的日期
  • 对不起,我以为你在追求每日最大值。我已经对其进行了修改,以获取每年的最大月值以及发生这种情况的适当日期和时间。
【解决方案2】:

默认情况下,月频率 (M) 使用月末。如果您想要月初,则需要月份开始。 (女士)

例子:

np.random.seed(0)
timestamps = pd.DatetimeIndex(start='2020-01-01', end='2020-10-01', freq='1h')
df = pd.DataFrame({'Date': timestamps, 'data': np.random.randn(len(timestamps))})
df = df.groupby(pd.Grouper(key = 'Date', freq = 'MS')).max()

更多信息请参见this table。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-10
    • 2019-08-13
    • 2017-03-22
    • 2015-05-26
    • 2014-08-17
    • 1970-01-01
    • 2018-09-12
    • 2016-06-15
    相关资源
    最近更新 更多