2013-05-05 10 views
10

私は今は窮地に瀕しています。私は何かシンプルなものが欠けていると確信していますが、どのようにx単位で一連の日付を前に移動しますか?より具体的なケースでは、データフレーム内の日付シリーズに180日を追加したいと考えています。データフレーム内の日付に日を追加する

import pandas, numpy, StringIO, datetime 


txt = '''ID,DATE 
002691c9cec109e64558848f1358ac16,2003-08-13 00:00:00 
002691c9cec109e64558848f1358ac16,2003-08-13 00:00:00 
0088f218a1f00e0fe1b94919dc68ec33,2006-05-07 00:00:00 
0088f218a1f00e0fe1b94919dc68ec33,2006-06-03 00:00:00 
00d34668025906d55ae2e529615f530a,2006-03-09 00:00:00 
00d34668025906d55ae2e529615f530a,2006-03-09 00:00:00 
0101d3286dfbd58642a7527ecbddb92e,2007-10-13 00:00:00 
0101d3286dfbd58642a7527ecbddb92e,2007-10-27 00:00:00 
0103bd73af66e5a44f7867c0bb2203cc,2001-02-01 00:00:00 
0103bd73af66e5a44f7867c0bb2203cc,2008-01-20 00:00:00 
''' 
df = pandas.read_csv(StringIO.StringIO(txt)) 
df = df.sort('DATE') 
df.DATE = pandas.to_datetime(df.DATE) 
df['X_DATE'] = df['DATE'].shift(180, freq=pandas.datetools.Day) 

このコードでは、型エラーを生成します。ここでは

は、私がこれまで持っているものです。参考のために私が使用しています:

のPython 2.7.4 パンダ '0.12.0.dev-6e7c4d6' numpyの '1.7.1' 私はあなたを理解していれば、あなたが実際にshiftをしたくない

+0

TRとの誤差を投稿してください。私たちはあなたの問題が何であるかを見ることができます。また、180の日付を追加する場合は、その行のIDをどのようにしたいですか? 「南」? –

答えて

21

、あなた180日後の既存のDATEの横に新しい列を作成するだけです。その場合、あなたはtimedeltaを使用することができます。

>>> from datetime import timedelta 
>>> df.head() 
           ID    DATE 
8 0103bd73af66e5a44f7867c0bb2203cc 2001-02-01 00:00:00 
0 002691c9cec109e64558848f1358ac16 2003-08-13 00:00:00 
1 002691c9cec109e64558848f1358ac16 2003-08-13 00:00:00 
5 00d34668025906d55ae2e529615f530a 2006-03-09 00:00:00 
4 00d34668025906d55ae2e529615f530a 2006-03-09 00:00:00 
>>> df["X_DATE"] = df["DATE"] + timedelta(days=180) 
>>> df.head() 
           ID    DATE    X_DATE 
8 0103bd73af66e5a44f7867c0bb2203cc 2001-02-01 00:00:00 2001-07-31 00:00:00 
0 002691c9cec109e64558848f1358ac16 2003-08-13 00:00:00 2004-02-09 00:00:00 
1 002691c9cec109e64558848f1358ac16 2003-08-13 00:00:00 2004-02-09 00:00:00 
5 00d34668025906d55ae2e529615f530a 2006-03-09 00:00:00 2006-09-05 00:00:00 
4 00d34668025906d55ae2e529615f530a 2006-03-09 00:00:00 2006-09-05 00:00:00 

それは、任意のを助けていますか?

2

将来の読者のために、別々の行を異なる金額で変更したい場合は、代わりにPandas TimedeltaIndexを使用して一連のタイムゾーンを渡す必要があります。

たとえば、データを最も近いレポート期間にシフトし、各レコードが別の曜日に開始されている可能性があります。

import pandas as pd 
days_to_shift = pd.TimedeltaIndex(6 - launch_df['launch_dt'].dt.dayofweek) 
launch_df['launch_dt'] = launch_df['launch_dt'] + days_to_shift 
+0

** day days **(私のテストではデフォルトであったナノ秒の代わりに)を追加するには、次のようにunit argを追加する必要があります: 'days_to_shift = pd.TimedeltaIndex(6 - launch_df [" launch_dt "] .dt.dayofweek、unit = "D") ' – jpobst

3

pd.DateOffsetを使用できます。これはtimedeltaより速いと思われます。

In [930]: df['x_DATE'] = df['DATE'] + pd.DateOffset(days=180) 

In [931]: df 
Out[931]: 
           ID  DATE  x_DATE 
8 0103bd73af66e5a44f7867c0bb2203cc 2001-02-01 2001-07-31 
0 002691c9cec109e64558848f1358ac16 2003-08-13 2004-02-09 
1 002691c9cec109e64558848f1358ac16 2003-08-13 2004-02-09 
4 00d34668025906d55ae2e529615f530a 2006-03-09 2006-09-05 
5 00d34668025906d55ae2e529615f530a 2006-03-09 2006-09-05 
2 0088f218a1f00e0fe1b94919dc68ec33 2006-05-07 2006-11-03 
3 0088f218a1f00e0fe1b94919dc68ec33 2006-06-03 2006-11-30 
6 0101d3286dfbd58642a7527ecbddb92e 2007-10-13 2008-04-10 
7 0101d3286dfbd58642a7527ecbddb92e 2007-10-27 2008-04-24 
9 0103bd73af66e5a44f7867c0bb2203cc 2008-01-20 2008-07-18 

タイミング

ミディアム

In [948]: df.shape 
Out[948]: (10000, 3) 

In [950]: %timeit df['DATE'] + pd.DateOffset(days=180) 
1000 loops, best of 3: 1.51 ms per loop 

In [949]: %timeit df['DATE'] + timedelta(days=180) 
100 loops, best of 3: 2.71 ms per loop 

In [952]: df.shape 
Out[952]: (100000, 3) 

In [953]: %timeit df['DATE'] + pd.DateOffset(days=180) 
100 loops, best of 3: 4.16 ms per loop 

In [955]: %timeit df['DATE'] + timedelta(days=180) 
10 loops, best of 3: 20 ms per loop 
関連する問題