Skip to content Skip to sidebar Skip to footer

Convertion Of Datetime To Numpy Datetime Without Timezone Info

Suppose I have a datetime variable: dt = datetime.datetime(2001,1,1,0,0) and I convert it to numpy as follows numpy.datetime64(dt) I get numpy.datetime64('2000-12-31T19

Solution 1:

I was just playing around with this the other day. I think there are 2 issues - how the datetime.datetime object is converted to np.datetime64, and how the later is displayed.

The numpy doc talks about creating a datatime64 object from a date string. It appears that when given a datetime.datetime object, it first produces a string.

np.datetime64(dt) == np.datetime64(dt.isoformat())

I found that I could add timezone info to that string

np.datetime64(dt.isoformat()+'Z')  # default assumption
np.datetime64(dt.isoformat()+'-0500')

Numpy 1.7.0 reads ISO 8601 strings w/o TZ as local (ISO specifies this)

Datetimes are always stored based on POSIX time with an epoch of 1970-01-01T00:00Z

As for display, the test_datetime.py file offers some clues as to the undocumented behavior.

https://github.com/numpy/numpy/blob/280f6050d2291e50aeb0716a66d1258ab3276553/numpy/core/tests/test_datetime.py

e.g.:

deftest_datetime_array_str(self):
        a = np.array(['2011-03-16', '1920-01-01', '2013-05-19'], dtype='M')
        assert_equal(str(a), "['2011-03-16' '1920-01-01' '2013-05-19']")

        a = np.array(['2011-03-16T13:55Z', '1920-01-01T03:12Z'], dtype='M')
        assert_equal(np.array2string(a, separator=', ',
                    formatter={'datetime': lambda x :
                            "'%s'" % np.datetime_as_string(x, timezone='UTC')}),
                     "['2011-03-16T13:55Z', '1920-01-01T03:12Z']")

So you can customize the print behavior of an array with np.array2string, and np.datetime_as_string. np.set_printoptions also takes a formatter parameter.

The pytz module is used to add further timezone handling:

 @dec.skipif(not _has_pytz, "The pytz module is not available.")deftest_datetime_as_string_timezone(self):
        # timezone='local' vs 'UTC'
        a = np.datetime64('2010-03-15T06:30Z', 'm')
        assert_equal(np.datetime_as_string(a, timezone='UTC'),
                '2010-03-15T06:30Z')
        assert_(np.datetime_as_string(a, timezone='local') !=
                '2010-03-15T06:30Z')
        ....

Examples:

In [48]: np.datetime_as_string(np.datetime64(dt),timezone='local')
Out[48]: '2000-12-31T16:00:00.000000-0800'

In [49]: np.datetime64(dt)
Out[49]: numpy.datetime64('2000-12-31T16:00:00.000000-0800')

In [50]: np.datetime_as_string(np.datetime64(dt))
Out[50]: '2001-01-01T00:00:00.000000Z'

In [51]: np.datetime_as_string(np.datetime64(dt),timezone='UTC')
Out[51]: '2001-01-01T00:00:00.000000Z'

In [52]: np.datetime_as_string(np.datetime64(dt),timezone='local')
Out[52]: '2000-12-31T16:00:00.000000-0800'

In [81]: np.datetime_as_string(np.datetime64(dt),timezone=pytz.timezone('US/Eastern'))
Out[81]: '2000-12-31T19:00:00.000000-0500'

Post a Comment for "Convertion Of Datetime To Numpy Datetime Without Timezone Info"