2016-06-22 9 views
7

से numpy linspace बनाना मैं एक स्क्रिप्ट लिख रहा हूं जो एक्स अक्ष (matplotlib में) पर तारीखों के साथ कुछ डेटा प्लॉट करता है। बाद में एक स्पलीन बनाने के लिए मुझे उन तिथियों में से numpy.linspace बनाने की आवश्यकता है। क्या यह करना मुमकिन है?डेटाटाइम

मैं क्या कोशिश की है:

import datetime 
import numpy as np 

dates = [ 
    datetime.datetime(2015, 7, 2, 0, 31, 41), 
    datetime.datetime(2015, 7, 2, 1, 35), 
    datetime.datetime(2015, 7, 2, 2, 37, 9), 
    datetime.datetime(2015, 7, 2, 3, 59, 16), 
    datetime.datetime(2015, 7, 2, 5, 2, 23)] 

x = np.linspace(min(dates), max(dates), 500) 

यह इस त्रुटि फेंकता है:

TypeError: unsupported operand type(s) for *: 'datetime.datetime' and 'float' 

मैं भी np.datetime64 करने के लिए datetime परिवर्तित करने की कोशिश की है, लेकिन यह रूप में अच्छी तरह से काम नहीं करता:

dates = [ np.datetime64(i) for i in dates ] 
x = np.linspace(min(dates), max(dates), 500) 

त्रुटि:

TypeError: ufunc multiply cannot use operands with types dtype('<M8[us]') and dtype('float64') 
+0

वहाँ 'datetime' की एक' numpy' आवरण है, का एक np.array प्राप्त करने के लिए निम्नलिखित तरीके से np.linspace का उपयोग कर सकते 'एनपी .datetime64' (मुझे लगता है) कि काम कर सकता है। – hpaulj

+0

पहले से ही कोशिश की है, यह –

उत्तर

6

आप pandas का उपयोग कर विचार किया है? this possible duplicate question से एक दृष्टिकोण का उपयोग करके आप

import pandas as pd 

start = pd.Timestamp('2015-07-01') 
end = pd.Timestamp('2015-08-01') 
t = np.linspace(start.value, end.value, 100) 
t = pd.to_datetime(t) 

रैखिक timeseries

In [3]: np.asarray(t) 
Out[3]: 
array(['2015-06-30T17:00:00.000000000-0700', 
     '2015-07-01T00:30:54.545454592-0700', 
     '2015-07-01T08:01:49.090909184-0700', 
       ... 
     '2015-07-31T01:58:10.909090816-0700', 
     '2015-07-31T09:29:05.454545408-0700', 
     '2015-07-31T17:00:00.000000000-0700'], dtype='datetime64[ns]') 
5

जहां तक ​​मुझे पता है, np.linspace डेटाटाइम ऑब्जेक्ट्स का समर्थन नहीं करता है। लेकिन शायद हम जो मोटे तौर पर simulates यह हमारी अपनी समारोह बना सकते हैं:

def date_linspace(start, end, steps): 
    delta = (end - start)/steps 
    increments = range(0, steps) * np.array([delta]*steps) 
    return start + increments 

यह आपको steps चरणों में end को start से जा रहा तिथियों के साथ एक np.array देना चाहिए (अंतिम तिथि नहीं शामिल नहीं है, आसानी से संशोधित किया जा सकता) ।

+0

प्रश्न में है, धन्यवाद, अच्छी तरह से काम करता है। अगर मैं कर सकता था तो मैं +1 दूंगा (मैं नोब का बहुत अधिक हूं)। स्वीकार नहीं किया गया है (अभी तक), क्योंकि शायद –

+0

डेल्टा को अंतर्निहित कुछ के साथ आ जाएगा, और जब जोड़ा जाता है, तो अपर्याप्तता का कारण अंतराल के साथ समाप्त होने वाले अंतराल के अंतराल से मेल खाने वाले अंतिम मूल्य से मेल नहीं खाता है छोटे समय के मूल्य। – poleguy

0

अंतिम त्रुटि हमें बता रही है कि np.datetime ऑब्जेक्ट्स गुणा नहीं कर सकते हैं। जोड़ परिभाषित किया गया है - आप दिनांक में n टाइमस्टेप्स जोड़ सकते हैं और एक और तारीख प्राप्त कर सकते हैं। लेकिन यह किसी तारीख को गुणा करने का कोई मतलब नहीं है।

In [1238]: x=np.array([1000],dtype='datetime64[s]') 

In [1239]: x 
Out[1239]: array(['1970-01-01T00:16:40'], dtype='datetime64[s]') 

In [1240]: x[0]*3 
... 
TypeError: ufunc multiply cannot use operands with types dtype('<M8[s]') and dtype('int32') 

तो datetime वस्तुओं की एक श्रृंखला उत्पन्न करने के लिए सरल तरीका timesteps की सीमा को जोड़ने के लिए है। यहाँ, उदाहरण के लिए, मैं 10 सेकंड वेतन वृद्धि

In [1241]: x[0]+np.arange(0,60,10) 
Out[1241]: 
array(['1970-01-01T00:16:40', '1970-01-01T00:16:50', '1970-01-01T00:17:00', 
     '1970-01-01T00:17:10', '1970-01-01T00:17:20', '1970-01-01T00:17:30'], dtype='datetime64[s]') 
उपयोग कर रहा हूँ

linspace में त्रुटि के रूप में पूर्ण त्रुटि ढेर में देखा यह का परिणाम है, 1. द्वारा start गुणा करने के लिए कोशिश कर रहा है:

In [1244]: np.linspace(x[0],x[-1],10) 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-1244-6e50603c0c4e> in <module>() 
----> 1 np.linspace(x[0],x[-1],10) 

/usr/lib/python3/dist-packages/numpy/core/function_base.py in linspace(start, stop, num, endpoint, retstep, dtype) 
    88 
    89  # Convert float/complex array scalars to float, gh-3504 
---> 90  start = start * 1. 
    91  stop = stop * 1. 
    92 

TypeError: ufunc multiply cannot use operands with types dtype('<M8[s]') and dtype('float64') 

टिप्पणी के बावजूद ऐसा लगता है कि यह सिर्फ इनट्स को फ्लोट में परिवर्तित कर रहा है। वैसे भी यह datetime64 वस्तुओं के साथ दिमाग में नहीं लिखा गया था।

user89161's यदि आप linspace वाक्यविन्यास का उपयोग करना चाहते हैं तो जाने का तरीका है, अन्यथा आप प्रारंभिक तिथि में अपने चुने हुए आकार की वृद्धि को जोड़ सकते हैं।

arange काम करता है इन तिथियों के साथ:

In [1256]: np.arange(x[0],x[0]+60,10) 
Out[1256]: 
array(['1970-01-01T00:16:40', '1970-01-01T00:16:50', '1970-01-01T00:17:00', 
     '1970-01-01T00:17:10', '1970-01-01T00:17:20', '1970-01-01T00:17:30'], dtype='datetime64[s]') 
संबंधित मुद्दे