2012-08-16 20 views
10

मैं एक बड़ी पांडा DataFrameएक पांडा DataFrame के एक सबसेट timestamps की सूची के साथ DatetimeIndex द्वारा अनुक्रमित चयन

<class 'pandas.core.frame.DataFrame'> 
DatetimeIndex: 3425100 entries, 2011-12-01 00:00:00 to 2011-12-31 23:59:59 
Data columns: 
sig_qual 3425100 non-null values 
heave  3425100 non-null values 
north  3425099 non-null values 
west  3425097 non-null values 
dtypes: float64(4) 

मैं .ix[start_datetime:end_datetime] का उपयोग कर कि DataFrame का एक उपसमूह चुनने है और मैं एक peakdetect function जो रिटर्न को यह पारित दो अलग-अलग सूचियों में स्थानीय अधिकतमता और मिनीमा का सूचकांक और मूल्य। मैं अधिकतमता की सूचकांक स्थिति निकालता हूं और DataFrame.index का उपयोग करता हूं मुझे पैंडस टाइमस्टैम्प की एक सूची मिलती है।

मैं टाइमस्टैम्प की सूची .ix[] पर पास करके बड़े डेटाफ्रेम के प्रासंगिक सबसेट को निकालने का प्रयास करता हूं लेकिन यह हमेशा खाली DataFrame वापस लौटता प्रतीत होता है। मैं टाइमस्टैम्प की सूची में लूप कर सकता हूं और DataFrame से प्रासंगिक पंक्तियां प्राप्त कर सकता हूं लेकिन यह एक लंबी प्रक्रिया है और मैंने सोचा कि ix[] को the docs के अनुसार मानों की एक सूची स्वीकार करनी चाहिए?

अद्यतन (हालांकि मैं पांडा 0.7 के लिए उदाहरण का उपयोग करता है numpy.datetime64 के numpy.ndarray देखें):

: DataFrame का एक छोटा सा 8 दूसरा सबसेट नीचे चयन किया जाता है, # लाइनों मूल्यों के कुछ दिखाने
y = raw_disp['heave'].ix[datetime(2011,12,30,0,0,0):datetime(2011,12,30,0,0,8)] 
#csv representation of y time-series 
2011-12-30 00:00:00,-310.0 
2011-12-30 00:00:01,-238.0 
2011-12-30 00:00:01.500000,-114.0 
2011-12-30 00:00:02.500000,60.0 
2011-12-30 00:00:03,185.0 
2011-12-30 00:00:04,259.0 
2011-12-30 00:00:04.500000,231.0 
2011-12-30 00:00:05.500000,139.0 
2011-12-30 00:00:06.500000,55.0 
2011-12-30 00:00:07,-49.0 
2011-12-30 00:00:08,-144.0 

index = y.index 
<class 'pandas.tseries.index.DatetimeIndex'> 
[2011-12-30 00:00:00, ..., 2011-12-30 00:00:08] 
Length: 11, Freq: None, Timezone: None 

#_max returned from the peakdetect function, one local maxima for this 8 seconds period 
_max = [[5, 259.0]] 

indexes = [x[0] for x in _max] 
#[5] 

timestamps = [index[z] for z in indexes] 
#[<Timestamp: 2011-12-30 00:00:04>] 

print raw_disp.ix[timestamps] 
#Empty DataFrame 
#Columns: array([sig_qual, heave, north, west, extrema], dtype=object) 
#Index: <class 'pandas.tseries.index.DatetimeIndex'> 
#Length: 0, Freq: None, Timezone: None 

for timestamp in timestamps: 
    print raw_disp.ix[timestamp] 
#sig_qual  0 
#heave  259 
#north  27 
#west  132 
#extrema  0 
#Name: 2011-12-30 00:00:04 

अद्यतन 2: मैं created a gist, जो वास्तव में काम करता है, क्योंकि जब डेटा timestamps के सूचकांक कॉलम csv से में लोड किया जाता है की numpy सरणी के रूप में जमा हो जाती है वस्तुओं जो तारों के रूप में दिखाई देते हैं। मेरे अपने कोड के विपरीत जहां इंडेक्स <class 'pandas.tseries.index.DatetimeIndex'> टाइप है और प्रत्येक तत्व <class 'pandas.lib.Timestamp'> प्रकार है, मैंने सोचा कि pandas.lib.Timestamp की एक सूची उत्तीर्ण करने से व्यक्तिगत टाइमस्टैम्प पास करने के समान ही काम होगा, क्या इसे एक बग माना जाएगा?

यदि मैं स्ट्रिंग्स की सूची के रूप में इंडेक्स के साथ मूल DataFrame बना देता हूं, स्ट्रिंग्स की सूची के साथ पूछताछ ठीक काम करती है। यह डेटाफ्रेम के बाइट आकार को काफी हद तक बढ़ाता है।

अद्यतन 3: त्रुटि केवल बहुत बड़े DataFrames के साथ हो गया लगता है, मैं DataFrame (नीचे एक टिप्पणी में कुछ विस्तार) के विभिन्न आकार पर कोड reran और यह 2.7 मिलियन रिकॉर्ड के ऊपर एक DataFrame पर होने के लिए प्रकट होता । टाइमस्टैम्प के विरोध में तारों का उपयोग करना समस्या को हल करता है लेकिन स्मृति उपयोग को बढ़ाता है।

फिक्स्ड नवीनतम जिथब मास्टर (18/09/2012) में, पेज के नीचे वेस से टिप्पणी देखें।

उत्तर

15

df.ix [my_list_of_dates] को ठीक काम करना चाहिए।

In [193]: df 
Out[193]: 
      A B C D 
2012-08-16 2 1 1 7 
2012-08-17 6 4 8 6 
2012-08-18 8 3 1 1 
2012-08-19 7 2 8 9 
2012-08-20 6 7 5 8 
2012-08-21 1 3 3 3 
2012-08-22 8 2 3 8 
2012-08-23 7 1 7 4 
2012-08-24 2 6 0 6 
2012-08-25 4 6 8 1 

In [194]: row_pos = [2, 6, 9] 

In [195]: df.ix[row_pos] 
Out[195]: 
      A B C D 
2012-08-18 8 3 1 1 
2012-08-22 8 2 3 8 
2012-08-25 4 6 8 1 

In [196]: dates = [df.index[i] for i in row_pos] 

In [197]: df.ix[dates] 
Out[197]: 
      A B C D 
2012-08-18 8 3 1 1 
2012-08-22 8 2 3 8 
2012-08-25 4 6 8 1 
+0

उदाहरण के लिए धन्यवाद, यह है कि यह कैसे काम करने के लिए माना जाता है की मेरी समझ है, अब मैं यह कैसे अपने मूल प्रश्न में विफल हो रहा है का एक उदाहरण प्रदान की है था। – seumas

+0

आप पांडा का किस संस्करण का उपयोग कर रहे हैं? क्या raw_disp साझा करना संभव है? मेरे लिए 'अपडेट' ठीक काम करता है, y.ix [timestamps] (y डेटटाइम इंडेक्स) अपेक्षित आउटपुट देता है (मैं raw_disp.ix [timestamps] नहीं कर सकता क्योंकि raw_disp उपलब्ध नहीं है।) –

+0

पांडस संस्करण 0.8.1 , मैं छोटे डेटाफ्रेम पर त्रुटि को पुन: पेश करने का प्रयास कर रहा हूं लेकिन ऐसा नहीं होता है। जब मैं इसे 3 मिलियन से अधिक पंक्तियों के अपने बड़े डेटाफ्रेम पर आज़माता हूं तो मुझे एक खाली डेटाफ्रेम मिलता है। मैंने सफलतापूर्वक 2888264 पंक्तियों के डेटाफ्रेम पर त्रुटि को पुन: उत्पन्न किया है लेकिन यह 2665621 पंक्तियों के डेटाफ्रेम पर ठीक काम करता है।अगर मैं इसे पुन: पेश करना चाहता हूं तो मैं बड़ा डेटाफ्रेम अपलोड कर सकता हूं। – seumas

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