2015-10-28 48 views
1

这里是我的问题简而言之:我试图写我的数据(包含,其中,np.datetime64值)到csv,然后读取它们回来,并且希望我的时间不要改变......熊猫to_csv然后read_csv结果为numpy.datetime64搞砸了由于utc

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

这里是我的问题,从 df.to_csv( “富”)保存,这里pd.read_csv( “富”)上改变时代的结果一个简单的例子:

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 

有一个非常大的数量的问题,很多在网络上的信息,但现在我已经在Google上搜寻了一段时间,一直没能找到关于如何克服这个答案。应该有一些方法来保存祖鲁语中的数据, 或读取他们假设的UTC,但还没有找到任何方向是最好的(或甚至好?)的方式来做到这一点。 我可以做

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

但(使用默认的保存和读取混乱事情的时候加上其烦人)

回答

2

在我看来非常糟糕,在实践中,便携性和效率方面... numpy的构造函数很简单,很难做到你想要的。我会避免。改用:

pd.read_csv(StringIO(df.to_csv(index=False)),parse_dates=['Time']) 

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

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]') 

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

从历元开始,内部的日期时间保持为ns的int64

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') 
+0

我得到了numpy正在做的事情,这与您所描述的完全相同。我的问题是pandas parse_dates = ['Time']与numpy.datetime64构造函数的作用不同,例如: – ntg

+0

In [46]:pd.read_csv(StringIO(df.to_csv(index = False)),parse_dates = ['Time'])。Time [0] == np.datetime64(pd.read_csv(StringIO(df.to_csv(index = False)))。Time [0]) Out [46]:False – ntg

+0

因此,as你写,答案是使用parse_dates = ['Time'])。没有它,通过numpy构造函数产生的字符串可能会导致问题。 – ntg