2016-12-22 7 views
1

別のパンダ日付リストを使って日付リストを分割しようとしています。だから、:別のパンダの日付リストに基づいてパンダの日付リストを分割する

 date num 
0 2015-01-15 1.0 
1 2015-02-01 NaN 
2 2015-02-15 2.0 

を...しかし、もちろん、それはしていません:

d = {'date':['1/15/2015','2/15/2015'], 'num':[1,2]} 
s = {'split':['2/1/2015']} 

df = pd.DataFrame(d) 
sf = pd.DataFrame(s) 

df['date'] = pd.to_datetime(df['date']) 
sf['split'] = pd.to_datetime(sf['split']) 

df['date'].split_by(sf['split']) 

をもたらすであろう。シンプルなマージや参加ができていると思いますが、私はそれを理解できません。ありがとう。

また、'split'のリストに複数の日付が含まれていて、そのうちのいくつかが'date'リストの範囲外にある場合、それらは含まれたくありません。したがって基本的に、新しい範囲の範囲は古い範囲と同じになります。

(サイドノート:データフレームに辞書を変換して、すぐに日付時刻に日付文字列を変換する良い方法がありますならば、ケーキの上のアイシングであろうと)

+0

まず、 'df = pd.concat([df、sf])。sort_values( 'date')'が必要だと思います。したがって、sfの値が範囲内にある場合、dfの最大日付とdfの最小値が出力に追加されますか? – jezrael

+0

@jezrael - 右、 'sf'の値が' df ['date'] 'の最小値/最大値内にある場合にのみ日付を分割します。私は 'df'に別の列を追加して、保持したいDataFrameに他のデータがあることを示しました。 – pshep123

答えて

1

私はあなたがフィルタにboolean indexingが必要だと思いますALIGNためdfminとカラムdatemaxによってsf第次いでsort_valuesconcat、列の名前を変更する必要があります

d = {'date':['1/15/2015','2/15/2015'], 'num':[1,2]} 
s = {'split':['2/1/2015', '2/1/2016', '2/1/2014']} 

df = pd.DataFrame(d) 
sf = pd.DataFrame(s) 

df['date'] = pd.to_datetime(df['date']) 
sf['split'] = pd.to_datetime(sf['split']) 
print (df) 
     date num 
0 2015-01-15 1 
1 2015-02-15 2 

print (sf) 
     split 
0 2015-02-01 
1 2016-02-01 
2 2014-02-01 
mask = (sf.split <= df.date.max()) & (sf.split >= df.date.min()) 
print (mask) 
0  True 
1 False 
2 False 
Name: split, dtype: bool 

sf = sf[mask] 
print (sf) 
     split 
0 2015-02-01 

df = pd.concat([df, sf.rename(columns={'split':'date'})]).sort_values('date') 
print (df) 
     date num 
0 2015-01-15 1.0 
0 2015-02-01 NaN 
1 2015-02-15 2.0 
+0

それを釘付け!メール内の小切手。ありがとうございます。 – pshep123

+0

お受け取りいただきありがとうございます!私に電子メールを送りましたか? – jezrael

+0

私の喜び。そしてメールはなく、それはただの表現です... – pshep123

関連する問題