簡體   English   中英

在 Pandas 中按一天中的時間分組 dataframe

[英]Group dataframe by the hour of the day in Pandas

這是我第一次來這里。 我的目標是按一天中的時間對數據進行分組,將每個組的行的“流”列相加,然后除以 60。但是我在按一天中的時間對數據進行分組時遇到了一些困難。

這就是我的數據框(超過 150.000 行)的樣子: https://i.stack.imgur.com/i51V2.png

我嘗試使用以下代碼:

import pandas as pd
import datetime as dt

df = pd.read_csv('staz_1.csv')
df['timestamp'] = pd.to_datetime(df['timestamp'])
group = df.groupby(df.timestamp.dt.hour)['flow'].sum()/60 

但我獲得的數據僅按小時分組,沒有當天的區別,如下所示: https://i.stack.imgur.com/LBUZq.png

所以我的問題是:是否可以按每天的每個小時對數據進行分組以進行這樣的表示?

   timestamp               flow
1  2020-03-30 06:00:00     708.0
2  2020-03-30 07:00:00     862.0 
3  2020-03-30 08:00:00     858.0
4  2020-03-30 09:00:00     840.0
5  2020-03-30 10:00:00     835.0
...

提前感謝任何回復的人。

使用df.reset_index

df = df.groupby(df.timestamp.dt.hour)['flow'].sum().reset_index()
df['flow'] = df['flow']/60

如果您有日期時間 forms 內的列,則可以使用 pandas 函數來幫助使用.resample()方法更語義化地對數據進行分組。

您可以按任何時間值分組,例如dayshours ,因此您不必記住更復雜的語法,例如df.groupby([df.timestamp.dt.date, df.timestamp.dt.hour]) 您只需要df.resample("H") (如果您的索引已經在時間日期內)。

下面是如果您沒有將索引作為時間日期類型。 您需要首先指定要聚合的內容,在本例中是timestamp列。

import pandas as pd
import numpy as np

# Time is a column and created data per minute
df = pd.DataFrame({'timestamp': pd.date_range('2020-03-30', periods=300, freq='T'),
                   'flow': np.random.randint(60, 1000, 300)})
df
#               timestamp  flow
# 0   2020-03-30 00:00:00   488
# 1   2020-03-30 00:01:00   996
# 2   2020-03-30 00:02:00   437
# 3   2020-03-30 00:03:00   599
# 4   2020-03-30 00:04:00   405
# ..                  ...   ...
# 295 2020-03-30 04:55:00   302
# 296 2020-03-30 04:56:00   425
# 297 2020-03-30 04:57:00   404
# 298 2020-03-30 04:58:00   987
# 299 2020-03-30 04:59:00   135
# 
# [300 rows x 2 columns]

# Returns data frame
df.resample("H", on='timestamp').sum() / 60
#                            flow
# timestamp                      
# 2020-03-30 00:00:00  523.350000
# 2020-03-30 01:00:00  548.033333
# 2020-03-30 02:00:00  516.466667
# 2020-03-30 03:00:00  425.533333
# 2020-03-30 04:00:00  490.416667

下面是如果你有它作為索引。

# Index is time
df_idx = pd.DataFrame({'flow': np.random.randint(60, 1000, 300)},
                      index=pd.date_range('2020-03-30', periods=300, freq='T'))
df_idx
#                      flow
# 2020-03-30 00:00:00   532
# 2020-03-30 00:01:00   341
# 2020-03-30 00:02:00   964
# 2020-03-30 00:03:00   885
# 2020-03-30 00:04:00   186
# ...                   ...
# 2020-03-30 04:55:00   996
# 2020-03-30 04:56:00   946
# 2020-03-30 04:57:00   510
# 2020-03-30 04:58:00   564
# 2020-03-30 04:59:00   918
# 
# [300 rows x 1 columns]

# Returns a series
df_idx['flow'].resample('H').sum() / 60
# 2020-03-30 00:00:00    569.516667
# 2020-03-30 01:00:00    548.050000
# 2020-03-30 02:00:00    505.283333
# 2020-03-30 03:00:00    530.566667
# 2020-03-30 04:00:00    522.383333
# Freq: H, Name: flow, dtype: float64

如果我正確理解您的問題,在我看來,您有來自多個小時和多個日期的數據,並且希望每個組在特定日期成為特定小時? 如果是這種情況,那么您需要在 groupby 中使用兩列。 嘗試這個:

import pandas as pd
import datetime as dt

df = pd.read_csv('staz_1.csv')
df['timestamp'] = pd.to_datetime(df['timestamp'])
group = df.groupby([df.timestamp.dt.date, df.timestamp.dt.hour])['flow'].sum()/60 

請注意,這將在生成的分組 dataframe 中創建多索引,這可能很難處理。 您可以通過在group上使用.reset_index()來擺脫它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM