我想将年份,年份和小时数组转换为实际日期。 这是我的代码到目前为止:
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 `
答案 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))
作为旁注,我将列出变量命名为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
。
然而,从评论中,听起来这些实际上是int64
值的numpy数组。虽然你称它们为浮点数,int64
不是浮点类型,但它是整数类型。并且您可以将int64
转换为纯Python int
,而不会丢失范围或精度。
因此,由于datetime
和timedelta
构造函数不会接受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
。