convertion of datetime to numpy datetime without timezone info

独自空忆成欢 提交于 2019-12-11 02:07:03

问题


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:00:00.000000-0500')

with dtype('<M8[us]')

But this automatically takes into account my time-zone (i.e. EST in this case) and gives me back a date of 2001-12-31 and a time of 19:00 hours.

How can I convert it to datetime64[D] in numpy that ignores the timezone information and simply gives me

     numpy.datetime64('2001-01-01')

with dtype('<M8[D]')

The numpy datetime64 doc page gives no information on how to ignore the time-zone or give the default time-zone as UTC


回答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.:

def test_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.")
    def test_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'


来源:https://stackoverflow.com/questions/29616292/convertion-of-datetime-to-numpy-datetime-without-timezone-info

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!