2014-01-25 65 views
1

我有一個包含以下字段的CSV文件中的數據值計數的索引數據框:如何獲取其中的值是日期時間字符串

  • USER_ID
  • DATE_CREATED
  • date_edited
  • date_finalised;和
  • date_withdrawn

USER_ID和DATE_CREATED領域絕不會包含空值,但其它列總是會。

一個例子:

user_id, date_created, date_edited, date_finalised, date_withdrawn 
1, 2013-01-31 00:17:01, null, 2013-02-02 14:11:17, null 
2, 2013-01-31 01:00:15, 2013-01-31 01:00:30, null, null 

我想用含有某些日期期間倉內出現的每個日期時間列記錄的計數即每日一個數據幀中結束,每小時和每分鐘

使用上面的例子和每日頻率我會看到:

date, date_created, date_edited, date_finalised, date_withdrawn 
2013-01-31, 2, 1, 0, 0 
2013-02-01, 0, 0, 0, 0 
2013-02-02, 0, 0, 1, 0 

012導入文件後
data = pd.read_csv('filename.csv') 

實現此目的需要執行哪些步驟?

回答

3

首先,要確保每個日期列是一個datetime64柱(與許多行,你應該能夠使用parse_dates in the read_csv,但你可能需要使用to_datetime和強制= TRUE):

In [11]: df 
Out[11]: 
    user_id  date_created   date_edited  date_finalised date_withdrawn 
0  1 2013-01-31 00:17:01     NaT 2013-02-02 14:11:17   NaT 
1  2 2013-01-31 01:00:15 2013-01-31 01:00:30     NaT   NaT 

現在您可以例如value count for each date爲DATE_CREATED列:

In [12]: pd.value_counts(pd.DatetimeIndex(df.date_created).normalize()) 
Out[12]: 
2013-01-31 2 
dtype: int64 

而且concat這些系列在一起:

In [13]: pd.concat((pd.value_counts(pd.DatetimeIndex(df[col]).normalize()) for col in df.columns if 'date' in col), axis=1).fillna(0) 
Out[13]: 
      0 1 2 3 
NaT   0 1 1 2 
2013-01-31 2 1 0 0 
2013-02-02 0 0 1 0 

注:您可以.drop(pd.NaT),如果你不希望此行。

不幸的是read_csv的parse_dates=['date_created', 'date_edited', 'date_finalised', 'date_withdrawn']不與這個小例子(太多空)脅迫,一個黑客就是用這樣的:

for col in df.columns: 
    if 'date' in col: 
     df[col] = pd.to_datetime(df[col], coerce=True) 
+1

感謝。這很有用:-)。我也很感謝你的回答的清晰度,它幫助我理解了每個階段,而不是僅僅複製它。 – Emil

相關問題