由于utc

时间:2015-10-28 17:37:49

标签: python csv pandas datetime64

这是我的问题:我试图将我的数据(包含np.datetime64值等)写入csv然后再读回来,并希望我的时间不要改变......

正如许多地方所讨论的那样,np.datetime64将所有二进制文件和UTC保存在mem中,但是从本地时间读取字符串。

以下是我的问题的一个简单示例,此处pd.read_csv(" foo")已保存自 df.to_csv(" foo")导致改变时间:

In[184]: num = np.datetime64(datetime.datetime.now())
In[185]: num
Out[181]: numpy.datetime64('2015-10-28T19:19:42.408000+0100')
In[186]: df = pd.DataFrame({"Time":[num]})
In[187]: df
Out[183]: 
                        Time
0 2015-10-28 18:19:42.408000
In[188]: df.to_csv("foo")
In[189]: df2=pd.read_csv("foo")
In[190]: df2
Out[186]: 
   Unnamed: 0                        Time
0           0  2015-10-28 18:19:42.408000
In[191]: np.datetime64(df2.Time[0])
Out[187]: numpy.datetime64('2015-10-28T18:19:42.408000+0100')
In[192]: num == np.datetime64(df2.Time[0])
Out[188]: False

(像往常一样)

import numpy as np
improt pandas as pd

网上有很多问题和很多信息,但我现在已经谷歌搜索了一段时间,但却找不到如何解决这个问题的答案。应该有一些方法来保存祖鲁的数据, 或者读取他们假设UTC,但没有找到任何方向,这是最好的(甚至好的?)方式来做到这一点。 我能做到

In[193]: num == np.datetime64(df2.Time[0]+"Z")
Out[189]: True

但在我看来,在练习,便携性和效率方面真的很糟糕......(加上使用默认保存并阅读混乱时烦人的事情)

1 个答案:

答案 0 :(得分:2)

numpy构造函数简单地被破坏了,很少会做你想要的。我会简单地避免。改为使用:

In [42]: num = np.datetime64(datetime.datetime.now())

In [43]: num
Out[43]: numpy.datetime64('2015-10-28T10:02:22.298130-0400')

In [44]: df = pd.DataFrame({"Time":[num]})

In [45]: df
Out[45]: 
                        Time
0 2015-10-28 14:02:22.298130

In [46]: pd.read_csv(StringIO(df.to_csv(index=False)),parse_dates=['Time'])            
Out[46]: 
                        Time
0 2015-10-28 14:02:22.298130

In [47]: pd.read_csv(StringIO(df.to_csv(index=False)),parse_dates=['Time']).Time.values
Out[47]: array(['2015-10-28T10:02:22.298130000-0400'], dtype='datetime64[ns]')

np.datetime64在本地时区只是显示。它已经存储在UTC中。

int64

[47]只是一个本地显示器。时间如上。

自纪元以来,内部日期时间保持为ns的In [7]: Timestamp('2015-10-28 14:02:22.298130') Out[7]: Timestamp('2015-10-28 14:02:22.298130') In [8]: Timestamp('2015-10-28 14:02:22.298130').value Out[8]: 1446040942298130000 In [9]: np.array([1446040942298130000],dtype='M8[ns]') Out[9]: array(['2015-10-28T10:02:22.298130000-0400'], dtype='datetime64[ns]') In [10]: Timestamp(np.array([1446040942298130000],dtype='M8[ns]').view('i8').item()) Out[10]: Timestamp('2015-10-28 14:02:22.298130')

{{1}}