2016-11-29 4 views
-1

posted_at(datetime)列の値が過去200日以内で、owner列の値が指定した値であるように、pandasデータフレームをフィルタリングする必要があります。このクエリの結果として別のデータフレームが必要です。これを達成する方法は?datetime値に基づいてデータベースをフィルタリングする

enter image description here

+0

こんにちは、StackOverflowのへの歓迎。ヘルプページ、特に[ここではどのトピックについて聞かせていただけますか?](http://stackoverflow.com/help/on-topic)と[質問しないでください。」](http://stackoverflow.com/help/dont-ask)。さらに重要なことは、[Stack Overflow question checklist](http://meta.stackexchange.com/q/156810/204922)をお読みください。また、[最小、完全、および検証可能な例](http://stackoverflow.com/help/mcve)についても知りたいことがあります。 – secelite

答えて

0

あなたはTimedeltaによってdate substractでboolean indexingを使用することができます。

start = pd.to_datetime('2016-11-23 15:00:10') 
rng = pd.date_range(start, periods=10) 

df = pd.DataFrame({'posted_at': rng, 'owner': ['a'] * 5 + ['b'] * 5}) 
print (df) 
    owner   posted_at 
0  a 2016-11-23 15:00:10 
1  a 2016-11-24 15:00:10 
2  a 2016-11-25 15:00:10 
3  a 2016-11-26 15:00:10 
4  a 2016-11-27 15:00:10 
5  b 2016-11-28 15:00:10 
6  b 2016-11-29 15:00:10 
7  b 2016-11-30 15:00:10 
8  b 2016-12-01 15:00:10 
9  b 2016-12-02 15:00:10 
now = pd.datetime.now().date() 
print (now) 
2016-11-29 

#in real data change 5 to 200 
last5 = now - pd.Timedelta('5D') 

#another solution 
#last5 = now - pd.offsets.Day(5) 
print (last5) 
2016-11-24 

mask = (df.owner == 'a') & (df.posted_at > last5) & (df.posted_at < now) 
print (mask) 
0 False 
1  True 
2  True 
3  True 
4  True 
5 False 
6 False 
7 False 
8 False 
9 False 
dtype: bool 

print (df[mask]) 
    owner   posted_at 
1  a 2016-11-24 15:00:10 
2  a 2016-11-25 15:00:10 
3  a 2016-11-26 15:00:10 
4  a 2016-11-27 15:00:10 
+0

ありがとうございます。私はこの方向でのみ働いていた。これはまさに私が探していたものでした。受け入れていただきありがとうございます。 –

+0

小規模なアドバイス - [良い再現性のあるパンダの例を作る方法](http://stackoverflow.com/questions/20109391/how-to-make-good-reproducible-pandas-examples) - ダウンボートを取得せず、多くの素敵な回答を得る。いい日! – jezrael

関連する問題