2017-08-07 17 views
1

Iは以下のようにデータセットを有する:日付計算(TypeError例外:サポートされていないオペランドタイプ(S) - : 'STR' と 'STR')

 date_time  srch_co  srch_ci 
0 2014-11-03 16:02:28 2014-12-19 2014-12-15 
1 2013-03-13 19:25:01 2013-03-14 2013-03-13 
2 2014-10-13 13:20:25 2015-04-10 2015-04-03 
3 2013-11-05 10:40:34 2013-11-08 2013-11-07 
4 2014-06-10 13:34:56 2014-08-08 2014-08-03 
5 2014-12-16 14:34:39 2014-12-17 2014-12-16 

が、これは、データセットの情報である。

私は何をしたいのは、以下の機能を使用して、2つの新しい列を作成している
 <class 'pandas.core.frame.DataFrame'> 
RangeIndex: 100000 entries, 0 to 99999 
Data columns (total 3 columns): 
date_time 100000 non-null datetime64[ns] 
srch_co  99878 non-null object 
srch_ci  99878 non-null object 
dtypes: datetime64[ns](1), object(2) 
memory usage: 2.3+ MB 

def duration(row): 
    delta = (row['srch_co'] - row['srch_ci'])/np.timedelta64(1, 'D') 
    if delta <= 0: 
     return np.nan 
    else: 
     return delta 

sample['duration'] = sample.apply(duration, axis=1) 


def days_in_advance(row): 
    delta = (row['srch_ci'] - row['date_time'])/np.timedelta64(1, 'D') 
    if delta < 0: 
     return np.nan 
    else: 
     return delta 

sample['days_in_advance'] = sample.apply(days_in_advance, axis=1) 

をしかし、それは私がしたい日付の計算のように思えます常にエラーにぶつかります。私は検索し、いくつかの解決策を見つけて試しましたが、エラーを作成するか、または日付を不正確な値にするかのどちらかです。任意のヒントは感謝

sample["duration"] = sample["srch_co"] - sample["srch_ci"] 
sample["days_in_advance"] = sample["srch_co"] - sample["date_time"] 

:私はちょうど、各列の差異を計算する新しい列を作成したい

#1) 
def to_integer(dt_time): 
    return 10000*dt_time.year + 100*dt_time.month + dt_time.day 

#2) 
datetime.strptime(str(row[2]), '%Y%m%d%H%M%S') 

#3)  
pd.to_numeric(sample['date_time'], errors='coerce') 

#4) 
sample['srch_ci_int'] = sample['srch_ci'].astype(str).astype(int) 

私が使用しようとした方法のようなです。

+0

ここからわかる情報から、私は単純にth 'srch_ *'列から 'datetime'オブジェクトへの列は役に立ちます。 –

+0

私はなぜそれについて考えなかったのか分かりません。ありがとう! 'サンプル[ 'srch_co'] = pd.to_datetime(サンプル[ 'srch_co']) サンプル[ 'srch_ci'] = pd.to_datetime(サンプル[ 'srch_ci'])' これが働きました。 – tmhs

答えて

1

を言ってはNaNにすべてのネガを回すことができます(デフォルト値mask関数):

sample["srch_co"] = pd.to_datetime(sample["srch_co"]) 
sample["srch_ci"] = pd.to_datetime(sample["srch_ci"]) 

sample["duration"] = (sample["srch_co"] - sample["srch_ci"])/np.timedelta64(1, 'D') 
sample["days_in_advance"] = (sample["srch_co"] - sample["date_time"])/np.timedelta64(1, 'D') 

cols = ['duration','days_in_advance'] 
sample[cols] = sample[cols].mask(sample[cols] < 0) 
#first value of srch_ci column was changed for NaN output 
print (sample) 
      date_time srch_co srch_ci duration days_in_advance 
0 2014-11-03 16:02:28 2014-12-19 2015-12-15  NaN  45.331620 
1 2013-03-13 19:25:01 2013-03-14 2013-03-13  1.0   0.190961 
2 2014-10-13 13:20:25 2015-04-10 2015-04-03  7.0  178.444155 
3 2013-11-05 10:40:34 2013-11-08 2013-11-07  1.0   2.555162 
4 2014-06-10 13:34:56 2014-08-08 2014-08-03  5.0  58.434074 
5 2014-12-16 14:34:39 2014-12-17 2014-12-16  1.0   0.392604 
1

文字列から文字列を差し引いているようです。列を「日付」に変換するようにしてください。pd.to_datetimeを使用すると、別の日付から1日を引くことができます。

また、単純なリストよりもパンダを使用する最大のメリットの1つとして、forループやpd.DataFrame.subtract(series、axis = 0)などのベクター化された操作を使用しないことをお勧めします。あなたは違いを計算した後

することは、あなたはあなたが最初の列srch_cosrch_cito_datetimeを変換して、以下NaNから0として置き換える値のためmaskを使用する必要がある

dataframe[dataframe['duration'] < 0] = np.nan 
関連する問題