将年份,年份和小时数转换为python中的实际日期

时间:2013-10-07 23:44:23

标签: python

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

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 `

1 个答案:

答案 0 :(得分:1)

datetime个对象的构造函数需要一年,一个月和一天,以及可选的小时,分​​钟等。因此,您将当天作为月份,小时作为日期,并且没有时间。

最重要的是,day必须是一个月中的某一天,而不是一年中的某一天,hour必须是一个整数(如果是分钟,秒和微秒,则为适当)。

解决此问题的一个简单方法是使用年份的开头创建datetime,并使用timedelta添加日期和小时。

在我们处理它的同时,您可以通过直接遍历数组而非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

,它也会起作用

然而,从评论中,听起来这些实际上是int64值的numpy数组。虽然你称它们为浮点数,int64不是浮点类型,但它是整数类型。并且您可以将int64转换为纯Python int,而不会丢失范围或精度。

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