2015-08-26 16 views
16

मैं datetime ऑब्जेक्ट की श्रृंखला के लिए निकटतम तिथि का पता लगाएं, और मैं सरणी में जो तत्व किसी निश्चित तिथि के सबसे करीब है खोजने के लिए चाहते हैं (उदाहरण के लिए datetime.datetime(2014,12,16))किसी दिए गए दिनांक

This पोस्ट दिखाता है कि कैसे करने के लिए निकटतम दिनांक खोजें जो दी गई तिथि से पहले नहीं है। मैं इस कोड को कैसे बदल सकता हूं ताकि वह किसी तारीख से पहले की तारीखों को वापस कर सके?

उदाहरण के लिए, यदि सरणी datetime.datetime(2014,12,10) और datetime.datetime(2014,12,28) तत्वों को रखती है, तो पूर्व आइटम वापस लौटाया जाना चाहिए क्योंकि यह पूर्ण मूल्य में datetime.datetime(2014,12,16) के निकटतम है।

+0

हो सकता है कि आप तिथियों को क्रमबद्ध करने का प्रयास कर सकें, फिर उस तारीख से पहले और उसके बाद इंडेक्स की जांच कर रहे हों, जिसे आप देख रहे हैं और यह देखने के लिए कि कौन सा है? – Zarwan

+0

फिलहाल, मैं दिए गए दिनांक से पहले और बाद में सभी तत्वों को खोजने के लिए 'np.argwhere' का उपयोग करता हूं और क्रमशः अंतिम तत्वों का अंतिम भाग लेता हूं। समस्या यह है कि कभी-कभी 16 दिसंबर 2014 के बाद सरणी में कोई तिथियां नहीं होतीं, जो मेरी लिपि में एक समस्या है। निकटतम तारीख को ढूंढना बहुत आसान होगा। – user3600497

+0

आप [truncate] का उपयोग करने पर विचार कर सकते हैं (http://stackoverflow.com/questions/9877391/how-to-get-the-closest-single-row-after-a- विशिष्ट- डेटाटाइम-index-using-python-p) समारोह। –

उत्तर

34

इस समारोह items में datetime जो तारीख pivot के सबसे करीब है वापस आ जाएगी।

def nearest(items, pivot): 
    return min(items, key=lambda x: abs(x - pivot)) 

अच्छा हिस्सा इस समारोह datetime के अलावा अन्य प्रकार पर काम करता है भी बॉक्स से बाहर, प्रकार तुलना, घटाव और abs, उदा .: संख्या और वेक्टर प्रकार का समर्थन करता है।

+1

इसकी उत्कृष्टता पर सरलता। महान। –

+0

वाह, साफ! हो सकता है कि यह मेरी तरह की बिग्राम विधि पुन: उत्पन्न करने की कोशिश करे, लेकिन रास्ता कम। –

+0

बस सुरुचिपूर्ण! – artDeco

1
def nearestDate(base, dates): 
    nearness = { abs(base.timestamp() - date.timestamp()) : date for date in dates } 
    return nearness[min(nearness.keys())] 
11

जैसा कि this link लिंक पर उत्तर दिया गया है, 'ट्रंकेट' फ़ंक्शन आपके लिए है।

df.truncate(before='2012-01-07')

या आप 'निकटतम' विकल्प के साथ get_loc उपयोग कर सकते हैं।

df.iloc[df.index.get_loc(datetime.datetime(2016,02,02),method='nearest')] 
0

एक करीबी तारीख लगाने के लिए और timedelta (दो तिथियों के बीच अंतर) लौट मैं निम्नलिखित किया: आप के लिए निकटता के लिए एक न्यूनतम सीमा है जब

def nearest_date(items,pivot): 
    nearest=min(items, key=lambda x: abs(x - pivot)) 
    timedelta = abs(nearest - pivot) 
    return nearest, timedelta 

यह उपयोगी हो सकता अपने ऐप की तरह मैंने किया।

+0

@TamasHegedus के लिए धन्यवाद –

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