【问题标题】:Group every value within an hour into one value which is it's mean将一小时内的每个值分组为一个值,这是它的平均值
【发布时间】:2019-07-11 09:14:28
【问题描述】:

我需要那个小时内所有值的平均值,并且我需要在每天的所有这些时间里都这样做。

例如:

Date                    Col1
2016-01-01 07:00:00      1
2016-01-01 07:05:00      2
2016-01-01 07:17:00      3
2016-01-01 08:13:00      2
2016-01-01 08:55:00      10
.
.
.
.
.
.
.
.
2016-12-31 22:00:00      3
2016-12-31 22:05:00      3
2016-12-31 23:13:00      4
2016-12-31 23:33:00      5
2016-12-31 23:53:00      6

因此,我需要将该日期内该小时内的所有值组合为一个(意思是)。

预期输出:

Date                    Col1
2016-01-01 07:00:00      2           ##(2016-01-01 07:00:00, 07:05:00, 07:17:00) 3 values falls between the one hour range for that date i.e. 2016-01-01 07:00:00 - 2016-01-01 07:59:00, both inclusive.
2016-01-01 08:00:00      6
.
.
.
.
.
.
.
.
2016-12-31 22:00:00      3
2016-12-31 23:00:00      5

所以,如果我整年都这样做,那么最后总行数将是 365*24。

我尝试使用此answer 解决问题,但它不起作用。 谁能帮我?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    来自pandasresample 应该适合您的情况

    import pandas as pd
    
    df = pd.DataFrame({
        'Date':['2016-01-01 07:00:00','2016-01-01 07:05:00',
                '2016-01-01 07:17:00' ,'2016-01-01 08:13:00',
                '2016-01-01 08:55:00','2016-12-31 22:00:00',
                '2016-12-31 22:05:00','2016-12-31 23:13:00',
                '2016-12-31 23:33:00','2016-12-31 23:53:00'],
        'Col1':[1, 2, 3, 2, 10, 3, 3, 4, 5, 6]
    })
    
    df['Date'] = pd.to_datetime(df['Date'], format='%Y-%m-%d') # Convert series to datetime type
    
    df.set_index('Date', inplace=True) # Set Date column as index
    
    
    # for every hour, take the mean for the remaining columns of the dataframe 
    # (in this case only for Col1, fill the NaN with 0 and reset the index)
    df.resample('H').mean().fillna(0).reset_index()
    
    df.head()
    
        Date    Col1
    0   2016-01-01 07:00:00 2.0
    1   2016-01-01 08:00:00 6.0
    2   2016-01-01 09:00:00 0.0
    3   2016-01-01 10:00:00 0.0
    4   2016-01-01 11:00:00 0.0
    

    【讨论】:

    • 非常感谢!这行得通。此外,print(df.groupby([df['Date'].dt.date, df['Date'].dt.hour])['Col1'].mean()) 也可以:D
    【解决方案2】:

    试试groupbydt.hourmeanreset_indexassign

    print(df.groupby(df['Date'].dt.hour)['Col1'].mean().reset_index().assign(Date=df['Date']))
    

    前两行的输出:

                     Date  Col1
    0 2016-01-01 07:00:00     2
    1 2016-01-01 07:05:00     6
    

    【讨论】:

    • 这基本上是所有日期在那一小时内的所有值的平均值。因此,假设 1 月 1 日在上午 7 点至 8 点之间有 2 个值,而 1 月 2 日在上午 7 点至 8 点之间有 2 个值,那么它取 4 个值并取平均值。我想要的是那个特定的日期和那个小时。所以 1 月 1 日的平均值和 1 月 2 日的平均值。我希望我能够表达我在说什么。
    • @GopalChitalia 它符合你的输出,我正在做你说的逻辑,不要忘记接受并投票
    • 它没有。它基本上是在所有天的那个小时取所有值并对其进行平均。你可以检查它。您可以在此数据集上对其进行测试并告诉我:filebin.net/10umpjabyxf8cz3a PS:如果它似乎与我的问题相匹配,我肯定会支持您的答案并接受它
    • @GopalChitalia 哦,有什么理由一次做2
    • 我没明白你说的 2 是什么意思?
    猜你喜欢
    • 2017-06-22
    • 2021-07-17
    • 1970-01-01
    • 2022-07-15
    • 1970-01-01
    • 2019-07-05
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多