web-dev-qa-db-ja.com

DataFrame pandasの日付間の日数を含む列を追加します

「B」の日付から「A」の日付を減算し、差のある新しい列を追加します。

df
          A        B
one 2014-01-01  2014-02-28 
two 2014-02-03  2014-03-01

私は次のことを試しましたが、これをforループに含めようとするとエラーが発生します...

import datetime
date1=df['A'][0]
date2=df['B'][0]
mdate1 = datetime.datetime.strptime(date1, "%Y-%m-%d").date()
rdate1 = datetime.datetime.strptime(date2, "%Y-%m-%d").date()
delta =  (mdate1 - rdate1).days
print delta

私は何をすべきか?

65
Jase Villam

これらが日時列であると仮定すると(to_datetimeが適用されない場合)、それらを差し引くことができます:

df['A'] = pd.to_datetime(df['A'])
df['B'] = pd.to_datetime(df['B'])

In [11]: df.dtypes  # if already datetime64 you don't need to use to_datetime
Out[11]:
A    datetime64[ns]
B    datetime64[ns]
dtype: object

In [12]: df['A'] - df['B']
Out[12]:
one   -58 days
two   -26 days
dtype: timedelta64[ns]

In [13]: df['C'] = df['A'] - df['B']

In [14]: df
Out[14]:
             A          B        C
one 2014-01-01 2014-02-28 -58 days
two 2014-02-03 2014-03-01 -26 days

注:新しいpandas(0.10.1など)を使用していることを確認してください。これは古いバージョンでは機能しない場合があります。

71
Andy Hayden

'days'テキスト要素を削除するには、シリーズのdt()アクセサーを使用することもできます: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.dt .html

そう、

df['A'] = pd.to_datetime(df['A'])
df['B'] = pd.to_datetime(df['B'])

df['C'] = (df['B'] - df['A']).dt.days

返されるもの:

             A          B   C
one 2014-01-01 2014-02-03  33
two 2014-02-03 2014-03-01  26
69
Blodwyn Pig

リスト内包表記は、これを行うための最もPythonyな(そして最も速い)方法に対する最善の策です。

[int(i.days) for i in (df.B - df.A)]
  1. 私はタイムデルタを返します(例: '-58 days')
  2. i.daysは、この値を長整数値として返します(例:-58L)
  3. int(i.days)は、-58を求めます。

列が日時形式でない場合。短い構文は次のとおりです。df.A = pd.to_datetime(df.A)

10
A.Kot

これはどう:

times['days_since'] = max(list(df.index.values))  
times['days_since'] = times['days_since'] - times['months']  
times
1
Tom