4

(Python 2.7、Pandas 0.9)

これは簡単なことのように思えますが、Pandasを使用してデータフレーム内の2つの日付列の差を計算する方法がわかりません。このデータフレームにはすでにインデックスがあるため、どちらかの列をDateTimeIndexにすることは望ましくありません。

私が使用した文字列から各日付列を変換するには:

data.Date_Column = pd.to_datetime(data.Date_Column)

そこから、2つの列の間の経過時間を取得するには、次のようにします。

data.Closed_Date - data.Created_Date 

エラーを返します:

TypeError: %d format: a number is required, not a numpy.timedelta64

両方の列でdtypesをチェックすると、datetime64 [ns]が生成され、配列内の個々の日付はタイプtimestampです。

私は何が欠けていますか?

編集:

これは、個別のDateTimeIndexオブジェクトを作成して目的を達成できる例ですが、データフレームのコンテキストで実行しようとすると失敗します。

Created_Date = pd.DatetimeIndex(data['Created_Date'], copy=True)
Closed_Date = pd.DatetimeIndex(data['Closed_Date'], copy=True)

Closed_Date.day - Created_Date.day
[Out] array([ -3, -16,   5, ...,   0,   0,   0])

これで同じですが、データフレーム内にあります。

data.Created_Date = pd.DatetimeIndex(data['Created_Date'], copy=True)
data.Closed_Date = pd.DatetimeIndex(data.Closed_Date, copy=True)

data.Created_Date.day - data.Created_Date.day

AttributeError: 'Series' object has no attribute 'day'

それを試してみたい場合のデータの一部を次に示します。

data['Created Date'][0:10].to_dict()
{0: '1/1/2009 0:00',
 1: '1/1/2009 0:00',
 2: '1/1/2009 0:00',
 3: '1/1/2009 0:00',
 4: '1/1/2009 0:00',
 5: '1/1/2009 0:00',
 6: '1/1/2009 0:00',
 7: '1/1/2009 0:00',
 8: '1/1/2009 0:00',
 9: '1/1/2009 0:00'}

data['Closed Date'][0:10].to_dict()
{0: '1/7/2009 0:00',
 1: nan,
 2: '1/1/2009 0:00',
 3: '1/1/2009 0:00',
 4: '1/1/2009 0:00',
 5: '1/12/2009 0:00',
 6: '1/12/2009 0:00',
 7: '1/7/2009 0:00',
 8: '1/10/2009 0:00',
 9: '1/7/2009 0:00'}
4

1 に答える 1

6

更新:便利な回避策は、これをDatetimeIndexコンストラクター(通常は適用よりもはるかに高速です)で粉砕することです。次に例を示します。

DatetimeIndex(df['Created_Date']).day

0.15では、これはdt属性で(他の日時メソッドとともに)使用可能になります。

df['Created_Date'].dt.day

あなたのエラーは構文でした。それがうまくいくことを望むかもしれませんが、そうではありません。

data.Created_Date.day - data.Created_Date.day
AttributeError: 'Series' object has no attribute 'day'

このようなより複雑な選択では、次を使用できますapply

In [111]: df['sub'] = df.apply(lambda x: x['Created_Date'].day - x['Closed_Date'].day, axis=1)

In [112]: df[['Created_Date','Closed_Date','sub']]
Out[112]: 
         Created_Date         Closed_Date  sub
0 2009-01-07 00:00:00 2009-01-01 00:00:00    6
1                 NaT 2009-01-01 00:00:00    9
2 2009-01-01 00:00:00 2009-01-01 00:00:00    0
3 2009-01-01 00:00:00 2009-01-01 00:00:00    0
4 2009-01-01 00:00:00 2009-01-01 00:00:00    0
5 2009-01-12 00:00:00 2009-01-01 00:00:00   11
6 2009-01-12 00:00:00 2009-01-01 00:00:00   11
7 2009-01-07 00:00:00 2009-01-01 00:00:00    6
8 2009-01-10 00:00:00 2009-01-01 00:00:00    9
9 2009-01-07 00:00:00 2009-01-01 00:00:00    6

注意してください、おそらくこれらとは別に何かをする必要がありますNaT

In [114]: df.ix[1][1].day # NaT.day
Out[114]: -1

注::を使用.daysしてtimedeltaを使用すると、同様に奇妙な動作が発生しNaTます。

In [115]: df['sub2'] = df.apply(lambda x: (x['a'] - x['b']).days, axis=1)

In [116]: df['sub2'][1]
Out[116]: 92505
于 2012-11-20T21:07:57.290 に答える