2017-12-06 8 views
0

私はトランザクションデータの分析を行っており、一意の顧客ごとの最新のトランザクションからの経過日数を計算したいと考えています。今日の日付と別のdate_time列との間のパンダの差異はありますか?

memberId  transactionDate 
1111   2017-12-01 
2222   2017-12-03 
1111   2017-12-05 
3333   2017-12-06 

TransactionDateが日時の形式になりますように

私の最初のデータフレーム(DF1)が見えます。

これはMEMBERIDと、最新のトランザクションからの日数を持つ新しいデータフレームを作成しようとしている私のコードです:のようにデータフレームとして

import datetime as dt 
import pandas as pd 

NOW=dt.datetime(2017,12,06) 
gb=df1.groupby('memberId') 
df2=gb.agg({'transactionDate': lambda x: (NOW-x.max())})   

このリターン:

memberId  transactionDate 
1111   1 days 
2222   3 days 
3333   0 days 

しかし、私は日欲しいです日数ではなく整数で返されるようにします。 この問題を解決するために私の2回目の試行があった。

NOW=dt.datetime(2017,12,06) 
gb=df1.groupby('memberId') 
df2=gb.agg({'transactionDate': lambda x: (NOW-x.max()).days}) 

これはtransactionDateのためのエポックタイムのようなものを返す、とのように出力が見えます:私はそれが数字でエポックタイムスタンプを返していると思います

memberId  transactionDate 
1111   1970-01-01 00:00:00.000000001 
2222   1970-01-01 00:00:00.000000003 
3333   1970-01-01 00:00:00.000000000 

マイクロ秒単位の日数です。

memberId  transactionDate 
1111   1 
2222   3 
3333   0 

答えて

1

計算を行う前取引日を強制的に試してみてください。

は、どのように私のような出力を得ることができます。私はあなたがそれがDateTime型の書式に言ったけど、私の解決策はpandas version 0.20.2に取り組んでいる:

import datetime as dt 
import pandas as pd 

df1['transactionDate'] = pd.to_datetime(df1['transactionDate']) # <--- changing here 
#can also try df1['transactionDate'] = pd.to_datetime(df1['transactionDate'], format='%Y-%M-%d', errors='coerce') 
# will try to force the data into this format 

#df1['transactionDate'].dtype 
#dtype('<M8[ns]') 

NOW=dt.datetime(2017,12,6) 

# use NOW = dt.datetime.now() if you want to do this programmatically 

gb=df1.groupby('memberId') 
df2=gb.agg({'transactionDate': lambda x: (NOW-x.max()).days}) 

出力:

  transactionDate 
memberId     
1111     1 #I get 1 for my answer since the max date of 1111 is 2017-12-05 
2222     3 
3333     0 
+0

こんにちは@MattRを使用してみてください'transactionDate'をdatetime形式に変更するために上記で追加した行を追加しようとしましたが、私はまだ同じエポック時間の結果を得ています – bbodek

+0

@bbodek、どのpandasバージョンを使用していますか?変換前後の列の 'dtype'は何ですか?最後に、すべてのデータが 'yyyy-mm-dd'形式であることを確かめますか?場合によっては、間違ったフォーマットの単一の値があると、望ましくない結果をもたらすことになります。 – MattR

+0

@bbodekまた、 'df1 ['transactionDate'] = pd.to_datetime(df1 ['transactionDate']、format = '% %M-%d '、errors =' coerce ') ' – MattR

0

私は、次のコード

df2.reset_index(inplace=True,drop=True) 
df2['Date2']=df2['Date'].apply(lambda x: x.days) 
関連する問題