对象的构造函数datetime
需要年、月和日,以及可选的小时、分钟等。因此,您将日作为月传递,将小时作为日传递,而没有作为小时传递。
最重要的是,day
必须是一个月中的某一天,而不是一年中的某一天,并且hour
必须是一个整数(如果合适,可以使用单独的分钟、秒和微秒)。
解决此问题的一种简单方法是datetime
使用年初创建一个,然后使用 . 添加日期和小时数timedelta
。
当我们这样做时,您可以通过直接遍历数组而不是 over 来使代码更简洁range(len(…))
。
for y, d, h in zip(year, day, hour):
d0 = datetime.datetime(y, 1, 1, tzdata=pytz.UTC)
dt.append(d0 + datetime.timedelta(days=d, hours=h))
作为旁注,我将列表变量命名为years
、days
、hours
和dts
,因此我可以命名各个迭代值year
、day
、hour
和dt
。而且,当我们这样做的时候,我会把它写成一个辅助函数和一个列表推导,而不是一个for
循环和一个复杂的主体。并把当时的进口。像这样:
import datetime
import pytz
years = [2012,2012,2012]
days = [2,3,4] #day of year
hours = [12,12,12]
def make_date(year, day, hour, tzdata=pytz.UTC):
dt = datetime.datetime(year, 1, 1, tzdata=tzdata)
return dt + datetime.timedelta(days=day, hours=hour)
dts = [make_date(year, day, hour) for year, day, hour in zip(years, days, hours)]
以上适用于您的原始问题,其中years
和days
是整数列表,并且hours
是浮点数列表(如您的描述)或整数(如您的示例代码)。days
如果是浮动列表,它也可以工作,但不是years
.
但是,从评论中,听起来这些实际上是 numpyint64
值数组。尽管您称它们为浮点数,int64
但它不是浮点类型,而是整数类型。您可以将 an 转换int64
为纯 Python int
,而不会损失范围或精度。
因此,由于datetime
andtimedelta
构造函数不接受int64
值,只需将每个值转换为int
:
def make_date(year, day, hour, tzdata=pytz.UTC):
dt = datetime.datetime(int(year), 1, 1, tzdata=tzdata)
return dt + datetime.timedelta(days=int(day), hours=int(hour))
如果您的时间实际上是您最初声称的浮点类型,例如float64
,您希望使用float(hour)
而不是int(hour)
.
最后一件事:根据你的描述,我猜你的日子是从 0 开始的(还有你的时间,但这不太可能是错误的)。如果您的日子实际上是从 1 开始的,那么您显然需要做days=int(day)-1
.