2015-10-28 42 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