私はこれらの2つのデータフレームを持っています:
main_df:
value feed_id created_at
0 0.0 1010077.0 2019-03-06 07:38:18-05:00
1 1.0 1010077.0 2019-03-06 07:39:26-05:00
2 1.0 1010077.0 2019-03-06 07:40:33-05:00
3 1.0 1010077.0 2019-03-06 07:41:41-05:00
4 1.0 1010077.0 2019-03-06 07:42:49-05:00
5 1.0 1010077.0 2019-03-06 07:43:56-05:00
aux_df:
value feed_id created_at
0 20.298492 1009408.0 2019-03-06 07:35:33-05:00
1 20.315002 1009408.0 2019-03-06 07:36:34-05:00
2 20.315002 1009408.0 2019-03-06 07:37:36-05:00
3 20.359650 1009408.0 2019-03-06 07:38:36-05:00
4 20.359650 1009408.0 2019-03-06 07:39:37-05:00
5 20.383179 1009408.0 2019-03-06 07:40:38-05:00
6 20.383179 1009408.0 2019-03-06 07:41:38-05:00
7 20.449524 1009408.0 2019-03-06 07:42:39-05:00
8 20.449524 1009408.0 2019-03-06 07:43:40-05:00
9 20.521912 1009408.0 2019-03-06 07:44:41-05:00
この条件で次の(final_df)が必要です。aux_dfの「created_at」列に記述されている「タイムライン」を、両方の列に共通または非共通の値があるかどうかに関係なく、main_dfに完全にマージします。一般的なものについては、タイムスタンプ全体を取得し、秒単位の部分を無視します(すべての値が同じ日付、時間、分で整列されているが、秒ではないことに注意してください)。
value feed_id created_at
0 nan nan 2019-03-06 07:35:33-05:00
1 nan nan 2019-03-06 07:36:34-05:00
2 nan nan 2019-03-06 07:37:36-05:00
3 0.0 1010077.0 2019-03-06 07:38:36-05:00
4 1.0 1010077.0 2019-03-06 07:39:37-05:00
5 1.0 1010077.0 2019-03-06 07:40:38-05:00
6 1.0 1010077.0 2019-03-06 07:41:38-05:00
7 1.0 1010077.0 2019-03-06 07:42:39-05:00
8 1.0 1010077.0 2019-03-06 07:43:40-05:00
9 nan nan 2019-03-06 07:44:41-05:00
私が試したが成功しなかった戦略:
マージを使用します。
main_df ['created_at_2'] = main_df.created_at.dt.round( 'min')aux_df ['created_at_2'] = aux_df.created_at.dt.round( 'min')final_df = pd.merge(main_df、aux_df、on = ['created_at_2']、how = 'inner')
ただし、この例に示すように、この方法は堅牢ではありません。2019-03-06 07:40:33-05:00のようなタイムスタンプを丸めると、40分ではなく41分になります。また、分単位の連続した列が必要です。
これを使用して、タイムスタンプのタイムラインを再フォーマットすることができます。
main_df.created_at.map(lambda t: t.strftime('%Y-%m-%d %H:%M'))
aux_df.created_at.map(lambda t: t.strftime('%Y-%m-%d %H:%M'))
final_df = pd.merge(main_df, aux_df, on=['created_at_2'], how='inner')
ただし、このメソッドが堅牢であるかどうかはわかりません。それでも、「created_at」列から一般的ではない値にインデックスを付ける必要があります。それで、これを達成するためのより適切な方法はありますか?
前もって感謝します!
1つのアイデアは使用merge_asof
ですが、最後の行は異なります。
main_df['created_at'] = pd.to_datetime(main_df['created_at'])
aux_df['created_at'] = pd.to_datetime(aux_df['created_at'])
df = pd.merge_asof(aux_df[['created_at']], main_df, on=['created_at'])
print (df)
created_at value feed_id
0 2019-03-06 07:35:33-05:00 NaN NaN
1 2019-03-06 07:36:34-05:00 NaN NaN
2 2019-03-06 07:37:36-05:00 NaN NaN
3 2019-03-06 07:38:36-05:00 0.0 1010077.0
4 2019-03-06 07:39:37-05:00 1.0 1010077.0
5 2019-03-06 07:40:38-05:00 1.0 1010077.0
6 2019-03-06 07:41:38-05:00 1.0 1010077.0
7 2019-03-06 07:42:39-05:00 1.0 1010077.0
8 2019-03-06 07:43:40-05:00 1.0 1010077.0
9 2019-03-06 07:44:41-05:00 1.0 1010077.0
もう1つはSeries.dt.floor
代わりに使用することround
です:
main_df['created_at'] = pd.to_datetime(main_df['created_at'])
aux_df['created_at'] = pd.to_datetime(aux_df['created_at'])
main_df['created_at_2'] = main_df.created_at.dt.floor('min')
aux_df['created_at_2'] = aux_df.created_at.dt.floor('min')
df = pd.merge(aux_df[['created_at_2']], main_df, on=['created_at_2'], how='left')
print (df)
created_at_2 value feed_id created_at
0 2019-03-06 07:35:00-05:00 NaN NaN NaT
1 2019-03-06 07:36:00-05:00 NaN NaN NaT
2 2019-03-06 07:37:00-05:00 NaN NaN NaT
3 2019-03-06 07:38:00-05:00 0.0 1010077.0 2019-03-06 07:38:18-05:00
4 2019-03-06 07:39:00-05:00 1.0 1010077.0 2019-03-06 07:39:26-05:00
5 2019-03-06 07:40:00-05:00 1.0 1010077.0 2019-03-06 07:40:33-05:00
6 2019-03-06 07:41:00-05:00 1.0 1010077.0 2019-03-06 07:41:41-05:00
7 2019-03-06 07:42:00-05:00 1.0 1010077.0 2019-03-06 07:42:49-05:00
8 2019-03-06 07:43:00-05:00 1.0 1010077.0 2019-03-06 07:43:56-05:00
9 2019-03-06 07:44:00-05:00 NaN NaN NaT
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加