这是我的问题:我试图将我的数据(包含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
但在我看来,在练习,便携性和效率方面真的很糟糕......(加上使用默认保存并阅读混乱时烦人的事情)
答案 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}}