2016-06-22 47 views
7

私はx軸(matplotlib)の日付を含むデータをプロットするスクリプトを作成しています。後でスプラインを作成するには、これらの日付のうちnumpy.linspaceを作成する必要があります。それは可能ですか?それは、このエラースローnumpyのlinspaceをdatetimeから作成する

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.datetime64datetimeを変換しようとしたが、それは同様に動作しません。私が試した何

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からのアプローチを使用して、 `NP

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) 

は線形時系列

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はdatetimeオブジェクトをサポートしていません。しかし、おそらく、我々は大体それをシミュレートし、当社独自機能させることができます。これはあなたのstepsの手順でstartからendに行くの日付とnp.array与えるべき

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

を(終了日を含めていないが、簡単に変更することができます) 。

+0

ありがとう、うまく動作します。もし私ができるなら私は+1を与えるだろう(私はあまりにも多くの騒ぎである)。 (まだ)受け入れられていない場合は、誰かが組み込みの何かを思い付いてしまうかもしれません。 –

+0

デルタは不正確である可能性があります。また、加算すると、不正確さによって返される終了値が、小さな時間値。 – poleguy

0

最後のエラーは、np.datetimeオブジェクトには乗算できないことを示しています。追加が定義されました - 日付にnタイムステップを追加し、別の日付を取得することができます。しかし、それは日付を乗算する意味がありません。

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') 

コメントにもかかわらず、ちょうどintsをfloatに変換しているようです。とにかくそれは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]') 
関連する問題