簡體   English   中英

查找大熊貓中按星期幾分組的標准偏差和時間平均值

[英]Finding Standard Deviation and mean of time grouped by day of week in pandas

這是獲取基於星期幾的標准偏差和平均時間的最優選方法嗎?

如何將平均時間,標准差按目標名稱分組,然后按day_of_week分組?

另外,如何將一系列標准偏差和均值轉換為正確的時間格式? 我嘗試遍歷該系列並成功完成datetime.timedelta(seconds = item),但希望使用更多的熊貓方式進行操作。 感謝您的反饋意見。

我有一個包含日期時間戳記的數據集,如下所示:

Date        Time       TargetUser
10/10/2012  20:20:01   joe
10/11/2012  02:20:01   bob
10/13/2012  21:20:01   smo
10/16/2012  22:20:01   joe

我正在創建一個星期幾列,如下所示:

df['my_dates'] = pd.to_datetime(df['Date'])
df['day_of_week'] = df['my_dates'].dt.dayofweek
days = {dict of days of week ie 0:"Mon"}
df['day_of_week'] = df['day_of_week'].apply(lambda x: days[x])

我正在創建列以將一天中的總時間相加並創建一列:

df[['HH', 'MM','SS']] = df['Time'].str.split(':', expand=True)
df['seconds'] = (((df['HH'].astype(int) * 60) + df['MM'].astype(int)) * 60) + df['SS'].astype(int)

然后,我通過以下方式確定一周中某天的平均時間和標准差:

meantime = df['seconds'].groupby([df['day_of_week']]).mean()
std = df['seconds'].groupby([df['day_of_week']]).std(ddof=1)

(不基於以上數據)預期輸出:

Name          Day_of_week       Mean        STD
joe           mon               15:01:01    00:08:02
              tue               10:01:01    00:01:06 
bob           mon               11:11:11    00:20:30
smo           thur              07:07:07    00:03:02

通過連接日期和時間,然后使用pandas出色的datetime訪問器dt您應該能夠大大簡化您的工作。

df['DateTime'] = pd.to_datetime(df['Date'] + ' ' + df['Time'])
df['day_of_week'] = df.DateTime.dt.strftime('%a')
df['seconds'] = pd.to_timedelta(df.DateTime.dt.time.astype(str)).dt.seconds

這給你這個

         Date      Time TargetUser            DateTime day_of_week  seconds
0  10/10/2012  20:20:01        joe 2012-10-10 20:20:01         Wed    73201
1  10/11/2012  02:20:01        bob 2012-10-11 02:20:01         Thu     8401
2  10/13/2012  21:20:01        smo 2012-10-13 21:20:01         Sat    76801
3  10/16/2012  22:20:01        joe 2012-10-16 22:20:01         Tue    80401

然后按用戶和星期幾分組,請執行以下操作,並重命名您的列。

df1 = df.groupby(['TargetUser', 'day_of_week'])\
  .agg({'seconds':{'mean': lambda x: pd.to_timedelta(x.mean(), 's'), 
                   'std': lambda x: pd.to_timedelta(np.std(x, ddof=1))}})

df1最終輸出

                        seconds    
                           mean std
TargetUser day_of_week             
bob        Thu         02:20:01 NaT
joe        Tue         22:20:01 NaT
           Wed         20:20:01 NaT
smo        Sat         21:20:01 NaT

要刪除較高的列級別並將索引變成列,您可以執行以下操作:

df1.columns = df1.columns.droplevel()
df1.reset_index()

暫無
暫無

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

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