2017-06-15 2 views
1

データフレームには1日にタイムスタンプが1つしか含まれていないため、日付ごとに最新のものを選択する必要があります(値、タイムスタンプ自体ではありません)。 DFは次のようになります。私は希望のタイムスタンプを取得するためのフィルタとして使用する列の値を指定し各日付の最後のタイムスタンプを選択

def find_last_h(df,column): 
    newindex = [] 
    df2 = df.resample('d').last().dropna() 
    for x in df2[column].values: 
     newindex.append(df[df[column]==x].index.values[0]) 
    return pd.DatetimeIndex(newindex) 

れる:

       A  B  C 
2016-12-05 12:00:00+00:00 126.0 15.0 38.54 
2016-12-05 16:00:00+00:00 131.0 20.0 42.33 
2016-12-14 05:00:00+00:00 129.0 18.0 43.24 
2016-12-15 03:00:00+00:00 117.0 22.0 33.70 
2016-12-15 04:00:00+00:00 140.0 23.0 34.81 
2016-12-16 03:00:00+00:00 120.0 21.0 32.24 
2016-12-16 04:00:00+00:00 142.0 22.0 35.20 

私は、私は次の関数を定義することにより、必要なものを達成するために管理しました。ここでの問題は、一意ではない値の場合には、これは望ましくないことかもしれません。

使用されているもう一つの方法は次のとおりです。

grouped = df.groupby([df.index.day,df.index.hour]) 
    grouped.groupby(level=0).last() 

して、タイムスタンプを再構築するが、それは、より冗長です。スマートな方法は何ですか?

答えて

3

使用boolean indexing切り捨てtimesためduplicatedfloorによって作成されたマスクを持つ:

idx = df.index.floor('D') 
df = df[~idx.duplicated(keep='last') | ~idx.duplicated(keep=False)] 
print (df) 
         A  B  C 
2016-12-05 16:00:00 131.0 20.0 42.33 
2016-12-14 05:00:00 129.0 18.0 43.24 
2016-12-15 04:00:00 140.0 23.0 34.81 
2016-12-16 04:00:00 142.0 22.0 35.20 

reset_index + set_indexのもう一つの解決策:

df = df.reset_index().groupby([df.index.date]).last().set_index('index') 
print (df) 
         A  B  C 
index         
2016-12-05 16:00:00 131.0 20.0 42.33 
2016-12-14 05:00:00 129.0 18.0 43.24 
2016-12-15 04:00:00 140.0 23.0 34.81 
2016-12-16 04:00:00 142.0 22.0 35.20 

resamplegroupbydatesだけ失っ回:

print (df.resample('1D').last().dropna()) 
       A  B  C 
2016-12-05 131.0 20.0 42.33 
2016-12-14 129.0 18.0 43.24 
2016-12-15 140.0 23.0 34.81 
2016-12-16 142.0 22.0 35.20 

print (df.groupby([df.index.date]).last()) 
       A  B  C 
2016-12-05 131.0 20.0 42.33 
2016-12-14 129.0 18.0 43.24 
2016-12-15 140.0 23.0 34.81 
2016-12-16 142.0 22.0 35.20 
+0

ありがとうございました!質問は、| 〜idx.duplicated(Keep = False)が本当に必要ですか?私は右のブール値の配列を既にそれなしで得る! – marpis

+1

このコードは一意の行をすべて取得します。おそらくあなたの実際のデータではありませんが、あなたのサンプルを使用する場合は、3.それなしで行が削除されます。 – jezrael

0

df.resample('24H',kind='period').last().dropna()

+0

ではありません。 – jezrael

+0

紛失した時間はどういう意味ですか? – suvy

+0

の出力は時刻のない日付のみです。 – jezrael

関連する問題