-1

我想将年份、年份和小数小时的数组转换为真实日期。到目前为止,这就是我的代码:

year = [2012,2012,2012] day = [2,3,4] #day of year hour = [12,12,12] import datetime import pytz dt=list() for i in range(len(year)): dt.append(datetime.datetime(year[i], day[i], hour[i],tzinfo=pytz.UTC)) dt=np.array(dt) print dt `
4

1 回答 1

1

对象的构造函数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))

作为旁注,我将列表变量命名为yearsdayshoursdts,因此我可以命名各个迭代值yeardayhourdt。而且,当我们这样做的时候,我会把它写成一个辅助函数和一个列表推导,而不是一个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)]

以上适用于您的原始问题,其中yearsdays是整数列表,并且hours是浮点数列表(如您的描述)或整数(如您的示例代码)。days如果是浮动列表,它也可以工作,但不是years.

但是,从评论中,听起来这些实际上是 numpyint64值数组。尽管您称它们为浮点数,int64但它不是浮点类型,而是整数类型。您可以将 an 转换int64为纯 Python int,而不会损失范围或精度。

因此,由于datetimeandtimedelta构造函数不接受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.

于 2013-10-07T23:57:45.030 回答