2016-04-27 50 views
2

我有以下的原始數據,熊貓read_csv:解析時間字段正確

TranID,TranDate,TranTime,TranAmt 
A123456,20160427,02:18,9999.53 
B123457,20160426,02:48,26070.33 
C123458,20160425,03:18,13779.56 
A123459,20160424,03:18,18157.26 
B123460,20160423,04:18,215868.15 
C123461,20160422,04:18,23695.25 
A123462,20160421,05:18,57 
B123463,20160420,05:18,64594.24 
C123464,20160419,06:18,47890.91 
A123465,20160427,06:18,14119.74 
B123466,20160426,07:18,2649.6 
C123467,20160425,07:18,16757.38 
A123468,20160424,08:18,8864.78 
B123469,20160423,08:18,26254.69 
C123470,20160422,09:18,13206.98 
A123471,20160421,09:18,15872.45 
B123472,20160420,10:18,197621.18 
C123473,20160419,10:18,21048.72 

,我試圖導入原始數據採用PD read_csv,

Try1

import numpy as np 
import pandas as pd 

df = pd.read_csv('MyTest.csv', sep=',', header=0, parse_dates=['TranDate'], 
        usecols=['TranID','TranDate','TranTime','TranAmt'], 
        engine='python') 
print(df.dtypes) 
df[:5] 

輸出1

TranID    object 
TranDate datetime64[ns] 
TranTime   object 
TranAmt   float64 
dtype: object 
Out[12]: 
TranID TranDate TranTime TranAmt 
0 A123456 2016-04-27 02:18 9999.53 
1 B123457 2016-04-26 02:48 26070.33 
2 C123458 2016-04-25 03:18 13779.56 
3 A123459 2016-04-24 03:18 18157.26 
4 B123460 2016-04-23 04:18 215868.15 

Try2

import numpy as np 
import pandas as pd 

df = pd.read_csv('MyTest.csv', sep=',', header=0, parse_dates=['TranDate', 'TranTime'], 
       usecols=['TranID','TranDate','TranTime','TranAmt'], 
       engine='python') 
print(df.dtypes) 
df[:5] 

輸出2

TranID    object 
TranDate datetime64[ns] 
TranTime datetime64[ns] 
TranAmt   float64 
dtype: object 
Out[13]: 
TranID TranDate TranTime TranAmt 
0 A123456 2016-04-27 2016-04-27 02:18:00 9999.53 
1 B123457 2016-04-26 2016-04-27 02:48:00 26070.33 
2 C123458 2016-04-25 2016-04-27 03:18:00 13779.56 
3 A123459 2016-04-24 2016-04-27 03:18:00 18157.26 
4 B123460 2016-04-23 2016-04-27 04:18:00 215868.15 

我的困惑是與TranTime列。在Try1中,它顯示正確,但dtype是對象。在Try2中,pd將當前日期添加到時間,並且dtype是日期時間。

我希望此TranTime列被視爲時間並希望使用pd的groupby或pivot_table執行聚合。 如果我使用Try1方法,對象dtype是否會影響我的聚合? 如果我使用Try2方法,是否需要去除日期部分以便使用時間部分?

我精通SAS,其中SAS有日期,時間和日期時間信息和格式,其中底層數據類型只是數字。因此,我與Python的對象和日期時間dtypes混淆。

感謝, Lobbie

回答

1

在Python中,日期時間通常表示爲datetime.datetime對象。這些效率不高,這就是爲什麼熊貓使用數字時間戳的原因。

讀取數據(注意周圍的parse_dates參數的雙括號):

df = pd.read_csv(filename, parse_dates=[['TranDate', 'TranTime']]) 

>>> df.info() 
<class 'pandas.core.frame.DataFrame'> 
Int64Index: 18 entries, 0 to 17 
Data columns (total 3 columns): 
TranDate_TranTime 18 non-null datetime64[ns] 
TranID    18 non-null object 
TranAmt    18 non-null float64 
dtypes: datetime64[ns](1), float64(1), object(1) 

>>> df.head() 
    TranDate_TranTime TranID TranAmt 
0 2016-04-27 02:18:00 A123456 9999.53 
1 2016-04-26 02:48:00 B123457 26070.33 
2 2016-04-25 03:18:00 C123458 13779.56 
3 2016-04-24 03:18:00 A123459 18157.26 
4 2016-04-23 04:18:00 B123460 215868.15 

的日期和時間列已加入到只有一個列。一旦你有了這個時間戳,就很容易使用dt訪問器來訪問它的屬性,例如。

>>> df.groupby(df.TranDate_TranTime.dt.hour).TranAmt.sum().head() 
TranDate_TranTime 
2  36069.86 
3  31936.82 
4 239563.40 
5  64651.24 
6  62010.65 
Name: TranAmt, dtype: float64 

>>> df.groupby(df.TranDate_TranTime.dt.day).TranAmt.sum().head() 
TranDate_TranTime 
19  68939.63 
20 262215.42 
21  15929.45 
22  36902.23 
23 242122.84 
Name: TranAmt, dtype: float64 

有關熊貓的更多信息,請參閱熊貓文檔date functionality

+0

非常感謝您的詳細解答。一切都很好,我今天學到了一些新東西。問候,Lobbie – Lobbie

1
  1. 沒有聚集的感情,但你將失去的時間的一部分。
  2. 不,大多數情況下,您可以通過.dtaccessor訪問時間部分。
import pandas as pd 

df = pd.read_csv('MyTest.csv', parse_dates=[['TranDate', 'TranTime']]) 
print df 

TranDate_TranTime TranID TranAmt 
0 2016-04-27 02:18:00 A123456 9999.53 
1 2016-04-26 02:48:00 B123457 26070.33 
2 2016-04-25 03:18:00 C123458 13779.56 
3 2016-04-24 03:18:00 A123459 18157.26 
4 2016-04-23 04:18:00 B123460 215868.15 
5 2016-04-22 04:18:00 C123461 23695.25 
6 2016-04-21 05:18:00 A123462  57.00 
7 2016-04-20 05:18:00 B123463 64594.24 
8 2016-04-19 06:18:00 C123464 47890.91 
9 2016-04-27 06:18:00 A123465 14119.74 
10 2016-04-26 07:18:00 B123466 2649.60 
11 2016-04-25 07:18:00 C123467 16757.38 
12 2016-04-24 08:18:00 A123468 8864.78 
13 2016-04-23 08:18:00 B123469 26254.69 
14 2016-04-22 09:18:00 C123470 13206.98 
15 2016-04-21 09:18:00 A123471 15872.45 
16 2016-04-20 10:18:00 B123472 197621.18 
17 2016-04-19 10:18:00 C123473 21048.72 

解析和儘可能使用嵌套支架parse_dates=[[]]儘可能管理日期/時間爲一列。

print df.groupby(df.TranDate_TranTime.dt.hour).sum() 

     TranAmt 
2 36069.86 
3 31936.82 
4 239563.40 
5 64651.24 
6 62010.65 
7 19406.98 
8 35119.47 
9 29079.43 
10 218669.90 

print df.groupby(df.TranDate_TranTime.dt.minute).sum() 

     TranAmt 
18 710437.42 
48 26070.33 

得到你想要的樣子。

而你仍然可以在下面resampling之後groupby。

df2 = df.set_index('TranDate_TranTime').resample('60s').sum().dropna() 
print df2 

         TranAmt 
TranDate_TranTime    
2016-04-19 06:18:00 47890.91 
2016-04-19 10:18:00 21048.72 
2016-04-20 05:18:00 64594.24 
2016-04-20 10:18:00 197621.18 
2016-04-21 05:18:00  57.00 
2016-04-21 09:18:00 15872.45 
2016-04-22 04:18:00 23695.25 
2016-04-22 09:18:00 13206.98 
2016-04-23 04:18:00 215868.15 
2016-04-23 08:18:00 26254.69 
2016-04-24 03:18:00 18157.26 
2016-04-24 08:18:00 8864.78 
2016-04-25 03:18:00 13779.56 
2016-04-25 07:18:00 16757.38 
2016-04-26 02:48:00 26070.33 
2016-04-26 07:18:00 2649.60 
2016-04-27 02:18:00 9999.53 
2016-04-27 06:18:00 14119.74 

print df2.groupby(df2.index.day).sum() 

     TranAmt 
19 68939.63 
20 262215.42 
21 15929.45 
22 36902.23 
23 242122.84 
24 27022.04 
25 30536.94 
26 28719.93 
27 24119.27 
+0

嗨,但如果我想通過TranTime進行分組並總結TranAmt,我無法對您的建議做到這一點?謝謝。 – Lobbie

+1

@Lobbie你仍然可以像上面編輯的代碼一樣groupby。 – su79eu7k

+0

嗨,謝謝你的幫助。亞歷山大還展示了使用dt.accessor。問候,Lobbie – Lobbie