[英]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 = df.groupby(df.timestamp.dt.hour)['flow'].sum().reset_index()
df['flow'] = df['flow']/60
如果您有日期時間 forms 內的列,則可以使用 pandas 函數來幫助使用.resample()
方法更語義化地對數據進行分組。
您可以按任何時間值分組,例如days
或hours
,因此您不必記住更復雜的語法,例如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.