2017-02-08 6 views
0

パンダでは、タイムスタンプの残りの部分が同じである場合に、複数年にわたって値をグループ化するgroupby操作はありますか?パンダのデータフレーム:グループ間でのグループ

たとえば、12:00:00 01/01/2000、12:00:00 01/01/2001、および12:00:00 01/01/2002は、15:00:00と同じようにグループを形成します2000年1月1日、15時00分○○秒2001年1月1日15時00分○○秒と2002年1月1日...など

私は一種のでこれを達成することができます

group = pd.groupby(timeseries, by=[timeseries.index.minute, timeseries.index.hour, timeseries.index.day, timeseries.index.month])

ですが、実際には入力時間形式には醜く、柔軟性がありません。私が本当に欲しいのは、groupbyから年を除外する方法ですが、他のすべてを含めています。

+0

を日付ではなく、それは十分に機能しない理由は、あなたの質問に手の込んだだろうか? – Boud

+0

柔軟性がなく、醜い時系列データの解像度が2分の1秒よりも小さいと、複数のデータがグループ化されても機能しないという事実を実際に指していました。私の用法ではそうはありませんが、可能な限り多くの可能性のある状況をカバーしていきたいと思います。 明らかに、timeseries.index.secondを正面(など)に含めることができますが、小さくて小さな解像度では少しばかげてしまいます。私は、入力データの解像度に依存しない、より洗練された方法を望んでいました。 – EngStan

答えて

1

あなたはindexによって、いくつかの定数year、その後groupbyを設定することができます。

timeseries.index = timeseries.index.map(lambda t: t.replace(year=2010)) 
print (timeseries) 
group = timeseries.groupby(level=0).sum() 
print (group) 
1

あなたはTimedeltaIndexを作成するために、各年の開始のためのタイムスタンプを差し引くことができます。ベクトル化の方法でこれを行う方法の1つは、に注意する

>>> idx = pd.date_range('2000-01-01', periods=1000) 

>>> idx 
DatetimeIndex(['2001-01-01', '2001-01-02', '2001-01-03', '2001-01-04', 
       '2001-01-05', '2001-01-06', '2001-01-07', '2001-01-08', 
       '2001-01-09', '2001-01-10', 
       ... 
       '2003-09-18', '2003-09-19', '2003-09-20', '2003-09-21', 
       '2003-09-22', '2003-09-23', '2003-09-24', '2003-09-25', 
       '2003-09-26', '2003-09-27'], 
       dtype='datetime64[ns]', length=1000, freq='D') 

# note that pandas only handles datetime64[ns], so we convert back 
# using pd.to_datetime 

>>> deltas = idx - pd.to_datetime(idx.values.astype('datetime64[Y]')) 

>>> deltas 
TimedeltaIndex([ '0 days', '1 days', '2 days', '3 days', '4 days', 
        '5 days', '6 days', '7 days', '8 days', '9 days', 
       ... 
       '260 days', '261 days', '262 days', '263 days', '264 days', 
       '265 days', '266 days', '267 days', '268 days', '269 days'], 
       dtype='timedelta64[ns]', length=1000, freq=None) 

>>> group = pd.Series(np.arange(1000), idx).groupby(deltas) 

ことの一つは、うるう年で、例えばnumpyの、と異なる時間分解能datetime64型に変換されて - あなたは、いくつかで終わるだろう365-366日の日時の違いがあります。

0

これは何か?

t = pd.Series(['12:00:00 01/01/2000', '12:00:00 01/01/2001' ,'12:00:00 01/01/2002' ,'15:00:00 01/01/2000', '15:00:00 01/01/2001','15:00:00 01/01/2002']) 
df = pd.DataFrame(t.str.split(' ',1).tolist(), 
           columns = ['Time','Date']) 
df.groupby(['Time', 'Date']).required_function() 

あなたは時間にグループ化されたデータを取得し、ここで醜いと柔軟ではないのかわから

関連する問題