Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Creating numpy linspace out of datetime

I'm writing a script that plots some data with dates on the x axis (in matplotlib). I need to create a numpy.linspace out of those dates in order to create a spline afterwards. Is it possible to do that?

What I've tried:

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) 

It throws this error:

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

I've also tried converting datetime to np.datetime64, but that doesn't work as well:

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') 
like image 512
Maciej Gilski Avatar asked Jun 22 '16 09:06

Maciej Gilski


1 Answers

Update - 2022

As pointed out by @Joooeey and @Ehtesh Choudhury, pandas now has date_range, which makes creating numpy.linspace-like time series much simpler.

t = pd.date_range(start='2022-03-10',                   end='2022-03-15',                   periods=5) 

If it's important to have this time series as a numpy array, simply

>>> t.values  array(['2022-03-10T00:00:00.000000000', '2022-03-11T06:00:00.000000000',        '2022-03-12T12:00:00.000000000', '2022-03-13T18:00:00.000000000',        '2022-03-15T00:00:00.000000000'], dtype='datetime64[ns]') 

Original answer

Have you considered using pandas? Using an approach from this possible duplicate question, you can make use of np.linspace in the following way

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) 

To obtain an np.array of the linear 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]') 
like image 198
lanery Avatar answered Sep 22 '22 00:09

lanery