2016-09-21 7 views
1

私は、指定された日付に1時間ごとにシステムにログインするユーザーの数を数えようとしています。私が持っている日付は次のようになります。Pandas Grouping By Datetime

df= 

Name  Date 
name_1 2012-07-12 22:20:00 
name_1 2012-07-16 22:19:00 
name_1 2013-12-16 17:50:00 
... 
name_2 2010-01-11 19:54:00 
name_2 2010-02-06 12:10:00 
... 
name_2 2012-07-18 22:12:00 
... 
name_5423 2013-11-23 10:21:00 

私はユーザーが興味がないので、私はその列を削除した名前を付けます。私は、グループ化されたデータ構造を作成するために管理して、次のコマンド

grp = df.groupby(by=[df.Date.map(lambda x: (x.year, x.month, x.day, x.hour))]) 
df2 = pd.DataFrame({'Count' : grp.size()}).reset_index() 

grpを使用して新しいデータフレームdf2(year, month, day, hour)のタプルにdatetimeタイプを変換します。このついて行くのより良い/より効率的な方法があるかどう

私は思ったんだけど何forループ

for i in range(len(df2)): 
    proper_date = datetime.datetime(*df2['Date'][i]) 
    df2.set_value(i, 'Date', proper_date) 

を使用してdatetime型に戻ってそれを変換することができるよとは?

答えて

3

あなたが列Dateによってgroupbyhと集計sizeに変換することができます

print (df.Date.values.astype('datetime64[h]')) 
['2012-07-12T22+0200' '2012-07-16T22+0200' '2013-12-16T17+0100' 
'2010-01-11T19+0100' '2010-02-06T12+0100' '2012-07-18T22+0200' 
'2013-11-23T10+0100'] 

print (df.Name.groupby([df.Date.values.astype('datetime64[h]')]).size()) 
2010-01-11 19:00:00 1 
2010-02-06 12:00:00 1 
2012-07-12 22:00:00 1 
2012-07-16 22:00:00 1 
2012-07-18 22:00:00 1 
2013-11-23 10:00:00 1 
2013-12-16 17:00:00 1 
dtype: int64 

別の解決策:

print (df.Date.values.astype('<M8[h]')) 
['2012-07-12T22+0200' '2012-07-16T22+0200' '2013-12-16T17+0100' 
'2010-01-11T19+0100' '2010-02-06T12+0100' '2012-07-18T22+0200' 
'2013-11-23T10+0100'] 

print (df.Name.groupby([df.Date.values.astype('<M8[h]')]).size()) 
2010-01-11 19:00:00 1 
2010-02-06 12:00:00 1 
2012-07-12 22:00:00 1 
2012-07-16 22:00:00 1 
2012-07-18 22:00:00 1 
2013-11-23 10:00:00 1 
2013-12-16 17:00:00 1 
dtype: int64 
+0

または可能性:グループのための 'df.Date.round( 'H')' –

+0

キーなぜ単に: 'ハタ=のDF [ '日'] dt.hour'。 'df.groupby(grouper).count()'? – Kartik

+0

@ Kartik datetimeから分と秒だけ切り捨てる必要があるので、0に設定してください。 – jezrael

1

別の答えをリサンプリングを使用しました。それほど効率的ではないと思いますが、面白いです。

# Test data 
d = {'Date': ['2012-07-12 22:20:00', '2012-07-12 22:19:00', '2013-12-16 17:50:00', '2010-01-11 19:54:00', '2010-02-06 12:10:00', '2012-07-18 22:12:00'], 
    'Name': ['name_1', 'name_1', 'name_1', 'name_2', 'name_2', 'name_5']} 

df = pd.DataFrame(d) 
df['Date'] = pd.to_datetime(df['Date']) 
result = df.set_index('Date') 

# Resampling data for each hour 
result = result.resample('H').count() 
# Filtering to keep only hours with at least one row 
result[result['Name'] > 0] 

        Name 
Date      
2010-01-11 19:00:00  1 
2010-02-06 12:00:00  1 
2012-07-12 22:00:00  2 
2012-07-18 22:00:00  1 
2013-12-16 17:00:00  1