重新采样时间序列数据

3

我有一些随机的按小时记录的时间序列数据(让我们编造一些),如何对其进行重新采样,以得出每日的最大值,并创建一个单独的数据框列,用于记录每日最大值的小时数?

import pandas as pd 
import numpy as np 
from numpy.random import randint
import os

np.random.seed(10)  # added for reproductibility                                                                                                                                                                 

rng = pd.date_range('10/9/2018 00:00', periods=1000, freq='1H') 
df = pd.DataFrame({'Random_Number':randint(1, 100, 1000)}, index=rng)

df.index.name = 'Date'

重新采样随机数:

daily_summary = pd.DataFrame()

daily_summary['Random_Number_Resamp'] = df['Random_Number'].resample('D').max()


daily_summary.head()

接着尝试记录每日最大值发生的时间...

daily_summary['Hour_Map'] = daily_summary.Random_Number_Resamp.index.strftime('%H').astype('int')

daily_summary

上述代码不会抛出属性错误,但是 hour_map 会为零。当创建 daily_summary 数据框时,如何使 hour_map 在此步骤中也出现?
2个回答

1
你可以使用 groupby
df.groupby(df.index.normalize())['Random_Number'].agg(['idxmax', 'max']) 

输出(头):
                         idxmax     max
Date        
2018-10-09  2018-10-09 05:00:00     94
2018-10-10  2018-10-10 20:00:00     95
2018-10-11  2018-10-11 15:00:00     97
2018-10-12  2018-10-12 18:00:00     98
2018-10-13  2018-10-13 22:00:00     91

谢谢你的建议... normalize 是做什么用的?我还得研究一下 aggregate 做什么用。 - bbartling
它会将所有时间截断为00:00:00。聚合在这里只是在组上应用每个函数。当然,它还可以做更多的事情。 - Quang Hoang
能否将 idxmax 最大列仅表示为整数小时形式? - bbartling
由于某种原因,它给了我一个关键错误 KeyError: 'idxmax' - bbartling
看到更新了吗,我忘记在原始代码中添加 ['Random_Number']。没有它,你需要执行 new_df[('Random_Number','idxmax')]。对于造成的困惑,我很抱歉。 - Quang Hoang
显示剩余2条评论

0

我想我明白你在寻找什么...

只需在原始数据框中创建一个小时列,然后重新采样:

np.random.seed(10)  # added for reproductibility                                                                                                                                                                 

rng = pd.date_range('10/9/2018 00:00', periods=1000, freq='1H') 
df = pd.DataFrame({'Random_Number':randint(1, 100, 1000)}, index=rng)

df.index.name = 'Date'

# create hour column
df['hour'] = df.index.hour

# resample df
daily_summary = df.resample('D').max()

            Random_Number  hour
Date                           
2018-10-09             94    23
2018-10-10             95    23
2018-10-11             97    23
2018-10-12             98    23
2018-10-13             91    23

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接