2017-12-12 14 views
0

2つのデータフレームを関連付けて、訪問があったかどうかを確認します。Datetimeのstrのリストを日付時刻に変換する

def visiter(d,visits): 
    visit = visits[d.start_date:d.end_date] 
    out = visit[(visit['user_id'] == d.user_id)&(visit['merchant_id']==d.merchant_id)].head(1) #only take the first visit 
    return (out.index.date.astype('str')) 

data['visited_at']= data.apply(lambda x: str(visiter(x,visits)),axis =1) 

上記カラムの出力は、次のとおり

0    [] 
1    [] 
2 ['2017-04-24'] 
3    [] 
4    [] 
Name: visited_at, dtype: object 

pd.to_datetime(data.visited_at, errors = 'coerce')を用いてカラムを変換は、列全体NATを行います。

は、次のような正しい形式で日時を取得するために私ができるコードへの変更があります:2017-05-01 00:00:00

EDIT1: データフレームは、次のようになります。

削除必要
Index id user_id merchant_id marketing_email_id start_date end_date email_status sms_status created_at visited_at 
0 68989 68990 13277 38 437 2016-04-11 00:00:00 2016-04-16 00:00:00 1 NaN 2016-04-11 11:05:31 [] 
1 403557 403558 195246 179 2218 2017-06-09 00:00:00 2017-06-12 00:00:00 0 1 2017-06-09 06:01:04 [] 
2 333381 333382 127359 514 1820 2017-04-24 00:00:00 2017-05-01 00:00:00 0 1 2017-04-24 10:00:33 ['2017-04-24'] 
3 511815 511816 151653 259 1136 2017-08-05 00:00:00 2017-08-08 00:00:00 0 1 2017-08-05 11:31:19 [] 
4 167172 167173 51546 32 363 2016-08-05 00:00:00 2016-08-15 00:00:00 1 NaN 2016-08-05 12:00:43 [] 

答えて

1

stripによって[]

pd.to_datetime(data['visited_at'].str.strip('[]'), errors = 'coerce') 

data['visited_at'] = pd.to_datetime(data['visited_at'].str.strip('[]'), errors = 'coerce') 
print (data) 

         Index id  user_id merchant_id \ 
0 68989 68990 13277  38 437 2016-04-11 00:00:00 
1 403557 403558 195246 179 2218 2017-06-09 00:00:00 
2 333381 333382 127359 514 1820 2017-04-24 00:00:00 
3 511815 511816 151653 259 1136 2017-08-05 00:00:00 
4 167172 167173 51546  32 363 2016-08-05 00:00:00 

         marketing_email_id start_date end_date email_status \ 
0 68989 68990 13277   2016-04-16 00:00:00   1   NaN 
1 403557 403558 195246   2017-06-12 00:00:00   0   1.0 
2 333381 333382 127359   2017-05-01 00:00:00   0   1.0 
3 511815 511816 151653   2017-08-08 00:00:00   0   1.0 
4 167172 167173 51546   2016-08-15 00:00:00   1   NaN 

         sms_status created_at visited_at 
0 68989 68990 13277 2016-04-11 11:05:31  NaT 
1 403557 403558 195246 2017-06-09 06:01:04  NaT 
2 333381 333382 127359 2017-04-24 10:00:33 2017-04-24 
3 511815 511816 151653 2017-08-05 11:31:19  NaT 
4 167172 167173 51546 2016-08-05 12:00:43  NaT 

別の解決策は、if-else[0]によって選択最初の値を持つDF空でないかどうかを確認です:

def visiter(d,visits): 
    visit = visits[d.start_date:d.end_date] 
    out=visit[(visit['user_id'] == d.user_id)&(visit['merchant_id']==d.merchant_id)].head(1) 
    out = np.nan if out.empty else out.index.date[0] 
    return (out) 
+0

まだこれを

visited_at.apply(lambda x: pd.to_datetime(x[0]) if len(x) else x) 

リストの文字列ならば、あなたがそれをハックすることができます列全体をNATにします –

+0

別の提案はどうですか? – jezrael

+0

は、多くのリストが空であるため、エラーを返します –

0

visited_at実際にリスト([])の値、またはリストの文字列表現('[]')はありますか?

リストであれば、あなたはapplyを使用することができます。

visited_at.apply(lambda x: pd.to_datetime(x[1:-1]) if len(x)>2 else x) 

あなたが得るいずれかの方法:

0      [] 
1      [] 
2 2017-04-24 00:00:00 
3      [] 
4      [] 
+0

文字列のリスト[''] –

関連する問題