2014-01-25 63 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

相关问题