Creando espacios en blanco fuera de datetime

Estoy escribiendo un script que traza algunos datos con fechas en el eje x (en matplotlib). Necesito crear un numpy.linspace fuera de esas fechas para poder crear una spline después. ¿Es posible hacer eso?

Lo que he intentado:

 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) 

Lanza este error:

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

También he intentado convertir datetime a np.datetime64 , pero eso no funciona tan bien:

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

Error:

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

¿Has considerado usar pandas ? Usando un enfoque de esta posible pregunta duplicada , puede hacer uso de np.linspace de la siguiente manera

 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) 

Para obtener una np.array de la serie de tiempo lineal

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

Que yo sepa, np.linspace no admite objetos de fecha y hora. Pero quizás podamos hacer nuestra propia función que la simula de manera aproximada:

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

Esto debería proporcionarle un np.array con fechas que van de start a end en pasos (sin incluir la fecha de finalización, se pueden modificar fácilmente).

A partir de pandas 0.23 puedes usar date_range :

 import pandas as pd x = pd.date_range(min(dates), max(dates), periods=500).to_pydatetime() 
 import numpy # 1.15 start = numpy.datetime64('2001-01-01') end = numpy.datetime64('2019-01-01') # Linspace in days: days = numpy.linspace(start.astype('f8'), end.astype('f8'), dtype=' 

El último error nos dice que los objetos np.datetime no pueden multiplicarse. Se ha definido la adición: puede agregar n pasos de tiempo a una fecha y obtener otra fecha. Pero no tiene ningún sentido multiplicar una fecha.

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

Así que la forma sencilla de generar un rango de objetos de fecha y hora es agregar un rango de pasos de tiempo. Aquí, por ejemplo, estoy usando incrementos de 10 segundos

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

El error en linspace es el resultado de tratar de multiplicar el start por 1. , como se ve en la stack de errores completa:

 In [1244]: np.linspace(x[0],x[-1],10) --------------------------------------------------------------------------- TypeError Traceback (most recent call last)  in () ----> 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(' 

A pesar del comentario, parece que solo está convirtiendo ints a flotar. De todos modos no fue escrito teniendo en cuenta los objetos datetime64 .

user89161's es el camino a seguir si desea utilizar la syntax del linspace , de lo contrario, puede agregar los incrementos de su tamaño elegido a la fecha de inicio.

arange trabaja con estas fechas:

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