【问题标题】:How to group dataframe by hour using timestamp with Pandas如何使用带有 Pandas 的时间戳按小时对数据帧进行分组
【发布时间】:2018-08-15 20:35:53
【问题描述】:

我有以下使用时间戳索引的数据帧结构:

    neg neu norm    pol pos date
time                        
1520353341  0.000   1.000   0.0000  0.000000    0.000   
1520353342  0.121   0.879   -0.2960 0.347851    0.000   
1520353342  0.217   0.783   -0.6124 0.465833    0.000   

我根据时间戳创建一个日期:

data_frame['date'] = [datetime.datetime.fromtimestamp(d) for d in data_frame.time]

结果:

    neg neu norm    pol pos date
time                        
1520353341  0.000   1.000   0.0000  0.000000    0.000   2018-03-06 10:22:21
1520353342  0.121   0.879   -0.2960 0.347851    0.000   2018-03-06 10:22:22
1520353342  0.217   0.783   -0.6124 0.465833    0.000   2018-03-06 10:22:22

我想按小时分组,同时获取除时间戳之外的所有值的平均值,这应该是小时小组开始的地方。所以这是我要归档的结果:

    neg neu norm    pol pos
time                    
1520352000  0.027989    0.893233    0.122535    0.221079    0.078779
1520355600  0.028861    0.899321    0.103698    0.209353    0.071811

到目前为止,我最接近的是answer

data = data.groupby(data.date.dt.hour).mean()

结果:

    neg neu norm    pol pos
date                    
0   0.027989    0.893233    0.122535    0.221079    0.078779
1   0.028861    0.899321    0.103698    0.209353    0.071811

但我不知道如何保留考虑到 grouby 开始的时间的时间戳。

【问题讨论】:

    标签: python pandas dataframe timestamp pandas-groupby


    【解决方案1】:

    您是否尝试通过以下方式创建小时列:

    data_frame['hour'] = data_frame.date.dt.hour
    

    然后按小时分组:

    data = data.groupby(data.hour).mean()
    

    【讨论】:

    • 是的,这给了我和我现在一样的结果。问题是保持/生成小时开始的时间戳。
    【解决方案2】:

    您可以将时间戳列向下舍入到最接近的小时:

    import math
    df.time = [math.floor(t/3600) * 3600 for t in df.time]
    

    或者更简单,使用整数除法:

    df.time = [(t//3600) * 3600 for t in df.time]
    

    您可以按此列分组,从而保留时间戳。

    【讨论】:

    • 我怎么没想到这个?这完美地工作,这样一个简单而优雅的解决方案。谢谢!
    【解决方案3】:

    在我发布了我的按小时计算的解决方案后,我偶然发现了这个宝石,pd.DataFrame.resample

    # Construct example dataframe
    times = pd.date_range('1/1/2018', periods=5, freq='25min')
    values = [4,8,3,4,1]
    df = pd.DataFrame({'val':values}, index=times)
    
    # Resample by hour and calculate medians
    df.resample('H').median()
    

    如果您不想将时间作为索引,也可以使用 groupbyGrouper

    df = pd.DataFrame({'val':values, 'times':times})
    df.groupby(pd.Grouper(level='times', freq='H')).median()
    

    【讨论】:

    • 非常简洁的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    • 2023-03-16
    • 1970-01-01
    • 2023-01-24
    • 2019-12-12
    相关资源
    最近更新 更多