2012-11-18 18 views
18

में दिनांक सीमाएं दिन के लिए न्यूमपी और डेट्यूटिल के साथ लड़ने के बाद, मैंने हाल ही में अद्भुत पांडा पुस्तकालय की खोज की। मैं प्रलेखन और स्रोत कोड के माध्यम से पोरिंग कर रहा हूं, लेकिन मैं सही ब्रेकपॉइंट्स पर इंडेक्स जेनरेट करने के लिए date_range() कैसे प्राप्त कर सकता हूं, यह नहीं समझ सकता।पांडस

from datetime import date 
import pandas as pd 

start = date('2012-01-15') 
end = date('2012-09-20') 
# 'M' is month-end, instead I need same-day-of-month 
date_range(start, end, freq='M') 

मुझे क्या करना चाहते हैं:

2012-01-15 
2012-02-15 
2012-03-15 
... 
2012-09-15 

मुझे क्या मिलेगा:

2012-01-31 
2012-02-29 
2012-03-31 
... 
2012-08-31 

मैं महीने के आकार हिस्सा है कि एक महीने में दिनों की चर संख्या के लिए खाता होना चाहिए। यह dateutil.rrule के साथ संभव है:

rrule(freq=MONTHLY, dtstart=start, bymonthday=(start.day, -1), bysetpos=1) 

बदसूरत और अस्पष्ट है, लेकिन यह काम करता है। मैं इसे पांडा के साथ कैसे कर सकता हूं? मैंने date_range() और period_range() दोनों के साथ खेला है, अब तक कोई भाग्य नहीं है।

मेरे वास्तविक लक्ष्य groupby, crosstab और/या resample उपयोग करने के लिए रकम/साधन/अवधि के भीतर अलग-अलग प्रविष्टियों में से आदि के आधार पर प्रत्येक अवधि के लिए मूल्यों की गणना करने के लिए है। दूसरे शब्दों में, मैं से डेटा को बदलने के लिए चाहते हैं:

   total 
2012-01-10 00:01 50 
2012-01-15 01:01 55 
2012-03-11 00:01 60 
2012-04-28 00:01 80 

#Hypothetical usage 
dataframe.resample('total', how='sum', freq='M', start='2012-01-09', end='2012-04-15') 

   total 
2012-01-09   105 # Values summed 
2012-02-09   0 # Missing from dataframe 
2012-03-09   60 
2012-04-09   0 # Data past end date, not counted 

यह देखते हुए कि पांडा एक वित्तीय विश्लेषण उपकरण के रूप में जन्म लिया है, मैं लगभग निश्चित है कि वहाँ क्या करने के लिए एक सरल और तेज़ तरीका कर रहा हूँ इस। मदद की सराहना की!

उत्तर

20

freq='M' महीने-अंत आवृत्तियों के लिए है (here देखें)। वहाँ (उदाहरण के लिए "DOMXX" "DOM09" की तरह)

pd.date_range(start, end, freq='M').shift(15, freq=pd.datetools.day) 
+0

धन्यवाद, इस चाल मैं एक समाधान rrule हैक के आधार पर बनाने की जरूरत हो सकती है। हालांकि, यह किसी सीमा पर पुन: प्रयास करने में मदद नहीं करता है, क्योंकि पुनरावृत्ति अभी भी AFAIK महीने की शुरुआत में गठित डिब्बे का उपयोग करेगा। – knite

+4

यदि आप लगातार दिनों से स्थानांतरित करने जा रहे हैं तो इसे 'एमएस' शुरू करने के लिए अधिक समझदारी मिलती है: 'pd.date_range (प्रारंभ, अंत, freq = 'MS')। Shift (15, freq = pd। datetools.day) ' –

4

वास्तव में आवृत्ति नहीं "महीने के दिन" है,: लेकिन आप .shift (उस बात के लिए या किसी आवृत्ति) दिन के किसी भी संख्या से यह शिफ्ट करने के लिए उपयोग कर सकते हैं लेकिन मुझे कोई जोड़ने का कोई कारण नहीं दिख रहा है।

http://github.com/pydata/pandas/issues/2289

मैं क्योंकि resample एक ज्ञात आवृत्ति शासन गुजर की आवश्यकता है इस समय आप के लिए एक सरल समाधान का नहीं है। मुझे लगता है कि इसे किसी भी तिथि सीमा को मनमाने ढंग से बिन किनारों के रूप में उपयोग करने में सक्षम होने के लिए बढ़ाया जाना चाहिए। समय और हैकिंग का मामला ...

+1

यह प्रश्न सिर्फ 10K विचारों को मारा। शायद इस कार्यक्षमता पर फिर से विचार करने का समय है? – knite

4

कोशिश

date_range(start, end, freq=pd.tseries.offsets.DateOffset(months=1)) 
+0

'freq = ...' के लिए कोई भी pd.DateOffset (महीनों = 1) का उपयोग कर सकता है – calcium3000