2013-04-23 7 views
32

मैं पाइथन डेटाटाइम ऑब्जेक्ट्स का उपयोग करके पांडा डेटाफ्रेम को पढ़ने और टुकड़ा करने में सक्षम हूं, हालांकि मुझे इंडेक्स में केवल मौजूदा तिथियों का उपयोग करने के लिए मजबूर होना पड़ता है। उदाहरण के लिए, इस काम करता है:पाइथन पांडा डेटाफ्रेम दिनांक शर्तों के अनुसार स्लाइसिंग

>>> data 
<class 'pandas.core.frame.DataFrame'> 
DatetimeIndex: 252 entries, 2010-12-31 00:00:00 to 2010-04-01 00:00:00 
Data columns: 
Adj Close 252 non-null values 
dtypes: float64(1) 

>>> st = datetime.datetime(2010, 12, 31, 0, 0) 
>>> en = datetime.datetime(2010, 12, 28, 0, 0) 

>>> data[st:en] 
      Adj Close 
Date     
2010-12-31  593.97 
2010-12-30  598.86 
2010-12-29  601.00 
2010-12-28  598.92 

लेकिन अगर मैं एक आरंभ या समाप्ति तिथि जो मौजूद नहीं है DF में, मैं अजगर KeyError मिल का उपयोग करें।

मेरा प्रश्न: मैं दिनांक सीमा के लिए डेटाफ्रेम ऑब्जेक्ट से कैसे क्वेरी करूं; यहां तक ​​कि जब डेटाफ्रेम में प्रारंभ और समाप्ति तिथियां मौजूद नहीं होती हैं। क्या पांडा रेंज आधारित स्लाइसिंग के लिए अनुमति देता है?

मैं पांडा संस्करण 0.10.1

उत्तर

39

उपयोग searchsorted उपयोग कर रहा हूँ पहले निकटतम बार लगता है, और फिर इसका इस्तेमाल काट करने के लिए करने के लिए।

In [15]: df = pd.DataFrame([1, 2, 3], index=[dt.datetime(2013, 1, 1), dt.datetime(2013, 1, 3), dt.datetime(2013, 1, 5)]) 

In [16]: df 
Out[16]: 
      0 
2013-01-01 1 
2013-01-03 2 
2013-01-05 3 

In [22]: start = df.index.searchsorted(dt.datetime(2013, 1, 2)) 

In [23]: end = df.index.searchsorted(dt.datetime(2013, 1, 4)) 

In [24]: df.ix[start:end] 
Out[24]: 
      0 
2013-01-03 2 
+0

यदि मैं आपके उदाहरण को पेस्ट करता हूं, तो यह ठीक काम करता है। लेकिन मेरे प्रोग्राम में स्टार्ट एंड एंड वेरिएबल, हमेशा डेटाफ्रेम की लंबाई के लिए डिफ़ॉल्ट! मैं क्या गलत कर रहा हूं? - http://pastebin.com/raw.php?i=hfpHqF7s –

+0

लगता है कि आपको अपने 'डेटाफ्रेम' को आरोही क्रम में सॉर्ट करना चाहिए। – waitingkuo

+0

धन्यवाद, यह तब काम करता था जब डेटा आरोही क्रम में क्रमबद्ध किया गया था। –

23

लघु जवाब: अपने डेटा (data.sort()) पर क्रमबद्ध और उसके बाद मुझे लगता है कि सब कुछ जिस तरह से आप उम्मीद कर रहे हैं काम करेंगे।

हां, आप डेटाफ्रेम में मौजूद डेटाटाइम का उपयोग करके टुकड़ा कर सकते हैं। उदाहरण के लिए:

In [12]: df 
Out[12]: 
        0 
2013-04-20 1.120024 
2013-04-21 -0.721101 
2013-04-22 0.379392 
2013-04-23 0.924535 
2013-04-24 0.531902 
2013-04-25 -0.957936 

In [13]: df['20130419':'20130422'] 
Out[13]: 
        0 
2013-04-20 1.120024 
2013-04-21 -0.721101 
2013-04-22 0.379392 

जैसा कि आप देख सकते हैं, आपको डेटाटाइम ऑब्जेक्ट्स भी बनाना नहीं है; तार काम करते हैं।

क्योंकि आपकी अनुक्रमणिका में डेटाटाइम अनुक्रमिक नहीं हैं, व्यवहार अजीब है। हम मेरे उदाहरण यहाँ के सूचकांक ...

In [17]: df 
Out[17]: 
        0 
2013-04-22 1.120024 
2013-04-20 -0.721101 
2013-04-24 0.379392 
2013-04-23 0.924535 
2013-04-21 0.531902 
2013-04-25 -0.957936 

शफ़ल ... और एक ही टुकड़ा अपनाते हैं तो हम एक अलग परिणाम मिलता है। यह सीमा के अंदर पहला तत्व देता है और सीमा के बाहर पहले तत्व पर रुक जाता है।

In [18]: df['20130419':'20130422'] 
Out[18]: 
        0 
2013-04-22 1.120024 
2013-04-20 -0.721101 
2013-04-24 0.379392 

यह शायद उपयोगी व्यवहार नहीं है। यदि आप तिथियों की श्रेणियों का चयन करना चाहते हैं, तो क्या इसे पहले तारीख से सॉर्ट करना समझदारी होगी?

df.sort_index() 
+0

जब मैं ऐसा करने का प्रयास करता हूं, मुझे एक पायथन अपवाद मिलता है: टाइमसरीज त्रुटि: आंशिक अनुक्रमणिका केवल आदेशित समय श्रृंखला के लिए मान्य है। –

+0

अपवाद स्वयं व्याख्यात्मक था - मुझे डेटा को सॉर्ट करने में चूक गई थी ,((- धन्यवाद, टेक्स्ट आधारित स्लाइसिंग जैसा कि आपने ऊपर दिखाए गए कार्यों के अनुसार काम किया है। लेकिन मैंने सर्चसॉर्ट फ़ंक्शन का उपयोग किया क्योंकि प्रोग्राम की तिथियां पहले से ही डेटाटाइम ऑब्जेक्ट्स थीं। –

+2

डीएफ ['20130419': '20130422'] असाधारण है! यहां तक ​​कि स्पैस डेटा के साथ भी काम करता है (उदाहरण के लिएउस तारीख को निर्दिष्ट करना जो इंडेक्स में मौजूद नहीं है)। धन्यवाद! – fantabolous

4

इसे पूर्ण करने के लिए एक सरल मुखौटा का उपयोग कर सकते हैं:

date_mask = (data.index > start) & (data.index < end) 
dates = data.index[date_mask] 
data.ix[dates] 

वैसे, इस रूप में अच्छी तरह श्रेणीबद्ध अनुक्रमण के लिए काम करता है। उस स्थिति में data.index को data.index.levels[0] या इसी तरह के साथ बदल दिया जाएगा।

+0

इस उत्तर को अधिक upvotes की आवश्यकता है। मैं इसे हफ्तों के लिए देख रहा हूं! –

संबंधित मुद्दे