2

简而言之,这是我的问题:我正在尝试将我的数据(其中包含 np.datetime64 值)写入 csv,然后将它们读回,并希望我的时间不会改变......

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

这是我的问题的一个简单示例,此处从 df.to_csv("foo") 保存的 pd.read_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

网上有很多问题和大量信息,但我已经在谷歌上搜索了一段时间,但无法找到如何解决这个问题的答案。应该有某种方法可以将数据保存在 Zulu 中,或者假设 UTC 读取它们,但还没有找到任何最好的(甚至是好的?)方法。我可以

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

但这在我看来真的很糟糕,在实践、可移植性和效率方面......(加上它在使用默认保存和读取时很烦人)

4

1 回答 1

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] 只是一个局部显示。时间如上。

int64自纪元以来,内部日期时间被保存为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')
于 2015-10-28T18:03:51.773 回答