2012-10-19 13 views
6

मैं जब बुनियादी डेटा munging कर रही है, इस उदाहरण की तरह इस व्यवहार का सामना करना पड़ा:अनपेक्षित परिणाम वस्तुओं

In [55]: import pandas as pd 
In [56]: import numpy as np 
In [57]: rng = pd.date_range('1/1/2000', periods=10, freq='4h') 
In [58]: lvls = ['A','A','A','B','B','B','C','C','C','C'] 
In [59]: df = pd.DataFrame({'TS': rng, 'V' : np.random.randn(len(rng)), 'L' : lvls}) 

In [60]: df 
Out[60]: 
    L     TS   V 
0 A 2000-01-01 00:00:00 -1.152371 
1 A 2000-01-01 04:00:00 -2.035737 
2 A 2000-01-01 08:00:00 -0.493008 
3 B 2000-01-01 12:00:00 -0.279055 
4 B 2000-01-01 16:00:00 -0.132386 
5 B 2000-01-01 20:00:00 0.584091 
6 C 2000-01-02 00:00:00 -0.297270 
7 C 2000-01-02 04:00:00 -0.949525 
8 C 2000-01-02 08:00:00 0.517305 
9 C 2000-01-02 12:00:00 -1.142195 

समस्या:

In [61]: df['TS'].min() 
Out[61]: 31969-04-01 00:00:00 

In [62]: df['TS'].max() 
Out[62]: 31973-05-10 00:00:00 

जबकि यह ठीक लग रहा है:

In [63]: df['V'].max() 
Out[63]: 0.58409076701429163 

In [64]: min(df['TS']) 
Out[64]: <Timestamp: 2000-01-01 00:00:00> 

जब GroupBy के बाद योग:

In [65]: df.groupby('L').min() 
Out[65]: 
      TS   V 
L       
A 9.466848e+17 -2.035737 
B 9.467280e+17 -0.279055 
C 9.467712e+17 -1.142195 

In [81]: val = df.groupby('L').agg('min')['TS']['A'] 
In [82]: type(val) 
Out[82]: numpy.float64 

जाहिर है इस विशेष मामले में यह pd.Series समारोह के तर्क के रूप में आवृत्ति datetime सूचकांक का उपयोग कर के साथ कुछ है में:

In [76]: rng.min() 
Out[76]: <Timestamp: 2000-01-01 00:00:00> 

In [77]: ts = pd.Series(rng) 
In [78]: ts.min() 
Out[78]: 31969-04-01 00:00:00 

In [79]: type(ts.min()) 
Out[79]: numpy.datetime64 

लेकिन, मेरा प्रारंभिक समस्या टाइमस्टैम्प श्रृंखला के न्यूनतम/अधिकतम के साथ था pd.read_csv के माध्यम से तार से पार्स()

मैंने क्या गलत कर रहा हूँ?

+1

आप किस प्रकार का काम कर रहे हैं? 1.6 में टाइमस्टैम्प के प्रतिनिधित्व के साथ समस्याएं हैं। – meteore

+0

मैकपॉर्ट्स के माध्यम से यह सबकुछ 1.6.2 और पांडस 0.9.0 के तहत है। अपने संकेत के बाद, मैं [समान समस्या रिपोर्ट] पाया है (https://groups.google.com/forum/#!msg/pystatsmodels/n1oBBVYI5FQ/DwuvAOc32yAJ), बस यह पता लगाने की कि वे किस तरह मेरी स्थिति से संबंधित कोशिश कर रहा। – LukaszJ

+0

बीटीडब्ल्यू, मेटियोर, क्या आप (या कोई और) इस व्यवहार को दोहराने में सक्षम थे? – LukaszJ

उत्तर

5

@meteore बताते हैं, यह NumPy 1.6.x. में np.datetime64 प्रकार की स्ट्रिंग रेपर साथ एक समस्या है अंतर्निहित डेटा, अभी भी सही होना चाहिए। इस समस्या को हल करने के लिए, आप कुछ ऐसा कर सकते हैं:

In [15]: df 
Out[15]: 
    L     TS   V 
0 A 2000-01-01 00:00:00 0.752035 
1 A 2000-01-01 04:00:00 -1.047444 
2 A 2000-01-01 08:00:00 1.177557 
3 B 2000-01-01 12:00:00 0.394590 
4 B 2000-01-01 16:00:00 1.835067 
5 B 2000-01-01 20:00:00 -0.768274 
6 C 2000-01-02 00:00:00 -0.564037 
7 C 2000-01-02 04:00:00 -2.644367 
8 C 2000-01-02 08:00:00 -0.571187 
9 C 2000-01-02 12:00:00 1.618557 

In [16]: df.TS.astype(object).min() 
Out[16]: datetime.datetime(2000, 1, 1, 0, 0) 

In [17]: df.TS.astype(object).max() 
Out[17]: datetime.datetime(2000, 1, 2, 12, 0) 
+0

सच है, लेकिन न्यूनतम/अधिकतम का परिणाम टाइमस्टैम्प के रूप में बॉक्स किया जाना चाहिए। मैं एक मुद्दा खोलूंगा: http://github.com/pydata/pandas/issues/2083 –

+0

धन्यवाद! तो मुझे समस्या हल होने तक टाइमस्टैम्प प्रतिनिधित्व को बाईपास करना चाहिए? केवल इस विशेष मामले में या इस तरह के उपद्रव को सामान्यीकृत किया जा सकता है? – LukaszJ

+0

टाइमस्टैम्प ठीक है। समस्या numpy.datetime64 प्रतिनिधित्व है। समय-चिह्न वास्तव में अजगर datetime का एक उपवर्ग है और के रूप में @Wes_Mckinney उल्लेख किया है, हमारे द्वारा सुधार में डाल दिया जाएगा एक समय-चिह्न के रूप में numpy.datetime64 वापसी मान बॉक्स तो यह ठीक तरीके से दिखाया जा सकता है। –

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