2013-05-05 9 views
10

में तारीखों के लिए दिन जोड़ें मैं इस समय stymied हूँ। मुझे यकीन है कि मुझे कुछ आसान याद आ रही है, लेकिन आप 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) 

इस कोड को एक प्रकार त्रुटि उत्पन्न:

यहाँ मैं अब तक है। संदर्भ के लिए मैं उपयोग कर रहा हूँ:

अजगर 2.7.4 पांडा '0.12.0.dev-6e7c4d6' Numpy '1.7.1'

+0

tr के साथ त्रुटि पोस्ट करें एसीबैक ताकि हम देख सकें कि आपकी समस्या क्या है। साथ ही, यदि आप 180 तिथियां जोड़ना चाहते हैं, तो आप उन पंक्तियों के लिए आईडी क्या चाहते हैं? 'Nan'? –

उत्तर

21

अगर मैं तुम्हें समझ में, आप नहीं वास्तव में shift चाहते हैं, आप बस मौजूदा DATE के बगल में एक नया कॉलम बनाना चाहते हैं जो 180 दिन बाद है। उस मामले में, आप 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

भविष्य के पाठकों के लिए यदि आप विभिन्न पंक्तियों से अलग पंक्तियों को बदलना चाहते हैं तो आपको टाइमडेल्टस की श्रृंखला पारित करने के बजाय पांडस टिमडेल्टा इंडेक्स का उपयोग करने की आवश्यकता होगी।

उदाहरण के लिए मैं अपने डेटा को निकटतम रिपोर्ट अवधि में स्थानांतरित करना चाहता हूं और प्रत्येक रिकॉर्ड सप्ताह के एक अलग दिन पर शुरू हो सकता था।

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

** दिनों ** जोड़ने के लिए (नैनोसेकंड की बजाय, जो मेरे परीक्षण में डिफ़ॉल्ट था), आपको एक यूनिट तर्क जोड़ने की आवश्यकता हो सकती है, जैसे: 'days_to_shift = pd.TimedeltaIndex (6 - launch_df [" launch_dt "] .dt.dayofweek, इकाई = "डी") ' – 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