如何转换numpy。对象的Datetime64。datetime(或Timestamp)?

在下面的代码中,我创建了一个datetime、timestamp和datetime64对象。

import datetime
import numpy as np
import pandas as pd
dt = datetime.datetime(2012, 5, 1)
# A strange way to extract a Timestamp object, there's surely a better way?
ts = pd.DatetimeIndex([dt])[0]
dt64 = np.datetime64(dt)

In [7]: dt
Out[7]: datetime.datetime(2012, 5, 1, 0, 0)

In [8]: ts
Out[8]: <Timestamp: 2012-05-01 00:00:00>

In [9]: dt64
Out[9]: numpy.datetime64('2012-05-01T01:00:00.000000+0100')

注意:从Timestamp中很容易得到datetime:

In [10]: ts.to_datetime()
Out[10]: datetime.datetime(2012, 5, 1, 0, 0)

但是我们如何从numpy中提取datetime或Timestamp。datetime64 (dt64) ?

.

更新:在我的数据集中有一个有点讨厌的例子(也许是激励的例子)似乎是:

dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100')

它应该是datetime。datetime(2002,6,28,1,0),而不是long (!) (1025222400000000000L)…


当前回答

import numpy as np
import pandas as pd 

def np64toDate(np64):
    return pd.to_datetime(str(np64)).replace(tzinfo=None).to_datetime()

使用此函数获取python的原生datetime对象

其他回答

转换numpy。datetime64 to datetime对象,在numpy-1.8上表示UTC时间:

>>> from datetime import datetime
>>> import numpy as np
>>> dt = datetime.utcnow()
>>> dt
datetime.datetime(2012, 12, 4, 19, 51, 25, 362455)
>>> dt64 = np.datetime64(dt)
>>> ts = (dt64 - np.datetime64('1970-01-01T00:00:00Z')) / np.timedelta64(1, 's')
>>> ts
1354650685.3624549
>>> datetime.utcfromtimestamp(ts)
datetime.datetime(2012, 12, 4, 19, 51, 25, 362455)
>>> np.__version__
'1.8.0.dev-7b75899'

上面的例子假设天真的datetime对象由np解释。datetime64作为UTC时间。


将datetime转换为np。Datetime64和返回(numpy-1.6):

>>> np.datetime64(datetime.utcnow()).astype(datetime)
datetime.datetime(2012, 12, 4, 13, 34, 52, 827542)

它对单个np都有效。对象和np.datetime64的numpy数组。

想想np。datetime64与np.int8、np.int16等相同,并应用相同的方法在Python对象(如int、datetime和相应的numpy对象)之间进行转换。

你的“讨厌的例子”是正确的:

>>> from datetime import datetime
>>> import numpy 
>>> numpy.datetime64('2002-06-28T01:00:00.000000000+0100').astype(datetime)
datetime.datetime(2002, 6, 28, 0, 0)
>>> numpy.__version__
'1.6.2' # current version available via pip install numpy

我可以在安装的numpy-1.8.0上重新生成long值:

pip install git+https://github.com/numpy/numpy.git#egg=numpy-dev

同样的例子:

>>> from datetime import datetime
>>> import numpy
>>> numpy.datetime64('2002-06-28T01:00:00.000000000+0100').astype(datetime)
1025222400000000000L
>>> numpy.__version__
'1.8.0.dev-7b75899'

它返回long,因为对于numpy。datetime64类型.astype(datetime)等价于.astype(object),在numpy-1.8上返回Python整数(long)。

要获取datetime对象,可以:

>>> dt64.dtype
dtype('<M8[ns]')
>>> ns = 1e-9 # number of seconds in a nanosecond
>>> datetime.utcfromtimestamp(dt64.astype(int) * ns)
datetime.datetime(2002, 6, 28, 0, 0)

获取直接使用秒的datetime64:

>>> dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100', 's')
>>> dt64.dtype
dtype('<M8[s]')
>>> datetime.utcfromtimestamp(dt64.astype(int))
datetime.datetime(2002, 6, 28, 0, 0)

numpy文档说datetime API是实验性的,在未来的numpy版本中可能会改变。

实际上,所有这些datetime类型都很困难,而且可能存在问题(必须仔细跟踪时区信息)。以下是我所做的,尽管我承认我担心至少有一部分是“非设计”的。此外,这可以根据需要做得更紧凑一些。 从numpy开始。datetime64 dt_a:

dt_a

numpy.datetime64 (2015 - 04 - 24 - t23:11:26.270000 - 0700)

dt_a1 = dt_a.tolist() #生成UTC格式的datetime对象,但不包含tzinfo dt_a1

datetime.datetime(2015, 4, 25, 6, 11, 26, 270000)

# now, make your "aware" datetime:

dt_a2=datetime.datetime(*list(dt_a1.timetuple()[:6]) + [dt_a1.microsecond], tzinfo=pytz.timezone('UTC'))

... 当然,也可以根据需要压缩成一行。

一些解决方案很适合我,但numpy将弃用一些参数。 对我来说,更好的解决方案是将日期读取为pandas datetime,并明确地提取pandas对象的年、月和日。 下面的代码适用于最常见的情况。

def format_dates(dates):
    dt = pd.to_datetime(dates)
    try: return [datetime.date(x.year, x.month, x.day) for x in dt]    
    except TypeError: return datetime.date(dt.year, dt.month, dt.day)

唯一的方法,我设法转换列“日期”在熊猫dataframe包含时间信息numpy数组如下:(dataframe是从csv文件“csv .csv”读取)

import pandas as pd
import numpy as np

df = pd.read_csv("csvIn.csv")
df["date"] = pd.to_datetime(df["date"])
timestamps = np.array([np.datetime64(value) for dummy, value in df["date"].items()])

我是这样做的

import pandas as pd

# Custom function to convert Pandas Datetime to Timestamp
def toTimestamp(data):
    return data.timestamp()

# Read a csv file
df = pd.read_csv("friends.csv")

# Replace the "birthdate" column by:
# 1. Transform to datetime
# 2. Apply the custom function to the column just converted
df["birthdate"] = pd.to_datetime(df["birthdate"]).apply(toTimestamp)