python获取当前时间年月日_python-从numpy datetime64中获取年,月或日

这篇博客介绍了如何在numpy 1.6.2版本下,从datetime64类型的数组中高效地获取年、月、日。提供了多种解决方案,包括使用pandas的DatetimeIndex属性、numpy自身的方法以及将datetime64转换为Python datetime对象等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

python-从numpy datetime64中获取年,月或日

我有一个datetime64类型的数组:

dates = np.datetime64(['2010-10-17', '2011-05-13', "2012-01-15"])

除了遍历每个元素以获得年的np.array之外,还有没有更好的方法:

years = f(dates)

#output:

array([2010, 2011, 2012], dtype=int8) #or dtype = string

我正在使用稳定的numpy版本1.6.2。

9个解决方案

36 votes

由于日期时间在numpy中不稳定,因此我将使用pandas:

In [52]: import pandas as pd

In [53]: dates = pd.DatetimeIndex(['2010-10-17', '2011-05-13', "2012-01-15"])

In [54]: dates.year

Out[54]: array([2010, 2011, 2012], dtype=int32)

熊猫内部使用numpy datetime,但似乎避免了numpy到目前为止的不足。

bmu answered 2020-01-29T09:00:00Z

24 votes

我发现以下技巧使速度提高了2倍至4倍(与上述熊猫方法相比)(即pd.DatetimeIndex(dates).year等)。 我发现[dt.year for dt in dates.astype(object)]的速度类似于pandas方法。 这些技巧也可以直接应用于任何形状的ndarray(2D,3D等)

dates = np.arange(np.datetime64('2000-01-01'), np.datetime64('2010-01-01'))

years = dates.astype('datetime64[Y]').astype(int) + 1970

months = dates.astype('datetime64[M]').astype(int) % 12 + 1

days = dates - dates.astype('datetime64[M]') + 1

Anon answered 2020-01-29T09:00:21Z

9 votes

应该有一种更简单的方法来执行此操作,但是,根据您要执行的操作,最好的方法可能是将其转换为常规的Python datetime对象:

datetime64Obj = np.datetime64('2002-07-04T02:55:41-0700')

print datetime64Obj.astype(object).year

# 2002

print datetime64Obj.astype(object).day

# 4

根据下面的评论,这似乎仅适用于Python 2.7.x和Python 3.6+

Nick answered 2020-01-29T09:00:45Z

3 votes

使用numpy版本1.10.4和pandas版本0.17.1,

dates = np.array(['2010-10-17', '2011-05-13', '2012-01-15'], dtype=np.datetime64)

pd.to_datetime(dates).year

我得到您想要的东西:

array([2010, 2011, 2012], dtype=int32)

Steve Schulist answered 2020-01-29T09:01:09Z

1 votes

如果您升级到numpy 1.7(datetime仍被标记为实验性),则应该可以进行以下操作。

dates/np.timedelta64(1,'Y')

Daniel answered 2020-01-29T09:01:31Z

1 votes

这就是我的方法。

import numpy as np

def dt2cal(dt):

"""

Convert array of datetime64 to a calendar array of year, month, day, hour,

minute, seconds, microsecond with these quantites indexed on the last axis.

Parameters

----------

dt : datetime64 array (...)

numpy.ndarray of datetimes of arbitrary shape

Returns

-------

cal : uint32 array (..., 7)

calendar array with last axis representing year, month, day, hour,

minute, second, microsecond

"""

# allocate output

out = np.empty(dt.shape + (7,), dtype="u4")

# decompose calendar floors

Y, M, D, h, m, s = [dt.astype(f"M8[{x}]") for x in "YMDhms"]

out[..., 0] = Y + 1970 # Gregorian Year

out[..., 1] = (M - Y) + 1 # month

out[..., 2] = (D - M) + 1 # dat

out[..., 3] = (dt - D).astype("m8[h]") # hour

out[..., 4] = (dt - h).astype("m8[m]") # minute

out[..., 5] = (dt - m).astype("m8[s]") # second

out[..., 6] = (dt - s).astype("m8[us]") # microsecond

return out

它可以跨任意输入维度进行矢量化处理,速度快,直观,可以在numpy v1.15.4上运行,并且不使用熊猫。

我真的希望numpy支持此功能,在应用程序开发中始终需要它。 当我不得不像这样滚动自己的东西时,我总是会非常紧张,我总是觉得自己缺少了一个极端的案例。

RBF06 answered 2020-01-29T09:02:00Z

0 votes

不幸的是,目前还没有直接的方法,但是有两种间接的方法:

[dt.year for dt in dates.astype(object)]

要么

[datetime.datetime.strptime(repr(d), "%Y-%m-%d %H:%M:%S").year for d in dates]

两者均受此处示例的启发。

这两个对我来说都适用于Numpy 1.6.1。 您可能需要对第二个更为谨慎,因为datetime64的repr()可能在小数点后有一个小数部分。

acjay answered 2020-01-29T09:02:33Z

0 votes

Anon的答案对我很有用,但我只需要修改days的语句

从:

days = dates - dates.astype('datetime64[M]') + 1

至:

days = dates.astype('datetime64[D]') - dates.astype('datetime64[M]') + 1

user3648119 answered 2020-01-29T09:03:02Z

0 votes

另一种可能性是:

np.datetime64(dates,'Y') - returns - numpy.datetime64('2010')

要么

np.datetime64(dates,'Y').astype(int)+1970 - returns - 2010

但仅适用于标量值,不会采用数组

Mark answered 2020-01-29T09:03:31Z

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值