2012-11-13 26 views
15

मेरे पास डिक्टटाइम तिथियों द्वारा की गई एक शब्दकोश का नाम दिनांक_डिक्ट है, जिसमें अवलोकन की पूर्णांक संख्याओं के अनुरूप मान हैं। मैं इसे सेंसर किए गए अवलोकनों के साथ एक स्पैस श्रृंखला/डेटाफ्रेम में परिवर्तित करता हूं जिसे मैं लगातार तारीखों के साथ एक श्रृंखला/डेटाफ्रेम में शामिल होना या कनवर्ट करना चाहता हूं। गंदा सूची समझ मेरी हैक इस तथ्य को पाने के लिए है कि पांडा स्पष्ट रूप से डेटटाइम डेट ऑब्जेक्ट्स को उचित डेटटाइम इंडेक्स में स्वचालित रूप से गुप्त नहीं करेंगे।स्पैस डेटाफ्रेम से निरंतर पांडा डेटाफ्रेम भरना

df1 = pd.DataFrame(data=date_dict.values(), 
        index=[datetime.datetime.combine(i, datetime.time()) 
          for i in date_dict.keys()], 
        columns=['Name']) 
df1 = df1.sort(axis=0) 

इस उदाहरण में 1258 अवलोकन हैं और डेटटाइम इंडेक्स 2003-06-24 से 2012-11-07 तक चलता है।

df1.head() 
      Name 
Date 
2003-06-24 2 
2003-08-13 1 
2003-08-19 2 
2003-08-22 1 
2003-08-24 5 

मैं एक सतत दिनांक समय सूचकांक के साथ एक खाली dataframe बना सकते हैं, लेकिन यह एक अनावश्यक स्तंभ का परिचय और भद्दा लगता है। मुझे लगता है कि मैं शामिल होने के साथ एक और अधिक सुरुचिपूर्ण समाधान खो रहा हूँ।

df2 = pd.DataFrame(data=None,columns=['Empty'], 
        index=pd.DateRange(min(date_dict.keys()), 
             max(date_dict.keys()))) 
df3 = df1.join(df2,how='right') 
df3.head() 
      Name Empty 
2003-06-24 2 NaN 
2003-06-25 NaN NaN 
2003-06-26 NaN NaN 
2003-06-27 NaN NaN 
2003-06-30 NaN NaN 

वहाँ एक सरल या अधिक सुरुचिपूर्ण तरीका एक विरल dataframe से एक सतत dataframe को भरने के लिए इतना है कि वहाँ (1) एक सतत सूचकांक, (2) Nans 0s हैं, और (3) वहाँ है कोई है डेटाफ्रेम में बाएं से अधिक खाली कॉलम?

  Name 
2003-06-24 2 
2003-06-25 0 
2003-06-26 0 
2003-06-27 0 
2003-06-30 0 

उत्तर

20

आप अपनी तिथि सीमा का उपयोग कर एक समय श्रृंखला पर रीइंडेक्स का उपयोग कर सकते हैं। ऐसा लगता है कि आप डेटाफ्रेम के बजाय टाइमसरीज़ का उपयोग करना बेहतर होगा (documentation देखें), हालांकि रीडएक्सिंग भी डेटाफ्रेम पर अनुपलब्ध इंडेक्स मान जोड़ने के लिए सही तरीका है।

उदाहरण के लिए, के साथ शुरू:

2003-06-24 2 
2003-08-13 1 
2003-08-19 2 
2003-08-22 1 
2003-08-24 5 

सीधे शब्दों में

ts.reindex(pd.date_range(min(date_index), max(date_index))) 

तो आप एक जटिल सूची देता है कर:

date_index = pd.DatetimeIndex([pd.datetime(2003,6,24), pd.datetime(2003,8,13), 
     pd.datetime(2003,8,19), pd.datetime(2003,8,22), pd.datetime(2003,8,24)]) 

ts = pd.Series([2,1,2,1,5], index=date_index) 

आप अपने उदाहरण dataframe के सिर की तरह एक समय श्रृंखला देता है , आपके लापता मूल्यों के लिए NaNs के साथ (यदि आप मील भरना चाहते हैं तो आप fillna का उपयोग कर सकते हैं कुछ अन्य मानों के साथ मूल्यों को एसएस करना - here देखें):

2003-06-24  2 
2003-06-25 NaN 
2003-06-26 NaN 
2003-06-27 NaN 
2003-06-28 NaN 
2003-06-29 NaN 
2003-06-30 NaN 
2003-07-01 NaN 
2003-07-02 NaN 
2003-07-03 NaN 
2003-07-04 NaN 
2003-07-05 NaN 
2003-07-06 NaN 
2003-07-07 NaN 
2003-07-08 NaN 
2003-07-09 NaN 
2003-07-10 NaN 
2003-07-11 NaN 
2003-07-12 NaN 
2003-07-13 NaN 
2003-07-14 NaN 
2003-07-15 NaN 
2003-07-16 NaN 
2003-07-17 NaN 
2003-07-18 NaN 
2003-07-19 NaN 
2003-07-20 NaN 
2003-07-21 NaN 
2003-07-22 NaN 
2003-07-23 NaN 
2003-07-24 NaN 
2003-07-25 NaN 
2003-07-26 NaN 
2003-07-27 NaN 
2003-07-28 NaN 
2003-07-29 NaN 
2003-07-30 NaN 
2003-07-31 NaN 
2003-08-01 NaN 
2003-08-02 NaN 
2003-08-03 NaN 
2003-08-04 NaN 
2003-08-05 NaN 
2003-08-06 NaN 
2003-08-07 NaN 
2003-08-08 NaN 
2003-08-09 NaN 
2003-08-10 NaN 
2003-08-11 NaN 
2003-08-12 NaN 
2003-08-13  1 
2003-08-14 NaN 
2003-08-15 NaN 
2003-08-16 NaN 
2003-08-17 NaN 
2003-08-18 NaN 
2003-08-19  2 
2003-08-20 NaN 
2003-08-21 NaN 
2003-08-22  1 
2003-08-23 NaN 
2003-08-24  5 
Freq: D, Length: 62 
+2

धन्यवाद! मैंने ts.reindex (pd.date_range (min (date_index), अधिकतम (date_index)), fill_value = 0 का उपयोग किया) –

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