如何从datetime64数组中获取一年中的第几天?
嘿,这问题我熟!给你两种靠谱的解决办法,一种是Numpy原生的高效方案(处理大数据组首选),另一种就是你问到的用timetuple().tm_yday的方式,按需选择就行~
解决方案
假设你的原始数组是这样的:
import numpy as np # 你的datetime64数组 dates = np.array(['1980-01-01T00:00:00.000000000', '1980-01-02T00:00:00.000000000', '1989-12-31T00:00:00.000000000'], dtype='datetime64[ns]')
方法一:Numpy原生高效实现(推荐)
Numpy本身对datetime64类型有很好的支持,不需要转成Python原生datetime对象就能快速计算一年中的第几天,效率拉满:
# 获取每个日期对应的当年第一天(精度到年) year_starts = dates.astype('datetime64[Y]') # 计算当前日期与当年第一天的天数差,加1就是一年中的第几天 day_of_year = (dates - year_starts) / np.timedelta64(1, 'D') + 1 # 转成整数类型,结果更规整 day_of_year = day_of_year.astype(int)
运行后你会得到:array([ 1, 2, 365]),完全符合预期——而且这种方法能自动处理闰年(比如1980年是闰年,2月29日会被计算为第60天)。
方法二:使用timetuple().tm_yday实现
如果一定要用timetuple().tm_yday,需要先把Numpy的datetime64元素转成Python原生的datetime对象,再调用方法:
# 把Numpy datetime数组转成Python datetime对象的列表 py_dates = dates.astype(object).tolist() # 遍历每个日期,提取tm_yday day_of_year = np.array([d.timetuple().tm_yday for d in py_dates])
或者用np.vectorize简化写法:
get_yday = np.vectorize(lambda d: d.timetuple().tm_yday) day_of_year = get_yday(dates.astype(object))
⚠️ 注意:这种方法的效率比Numpy原生方案低很多,如果你的数组规模很大(比如上百万条数据),不建议用这个。
内容的提问来源于stack exchange,提问作者maximusdooku
相关产品推荐
相关产品推荐

