我正在尝试将小数时间转换为日期时间对象以查找月份,以便稍后将时间划分为季节。我做了一些研究并偶然发现了datetime.datetime.fromtimestamp但我尝试过的所有内容都会产生以下错误:
TypeError: 'datetime.datetime' object is not iterable
过去,我曾使用熊猫创建一个新的时间数组,但不要觉得这对我的情况最好。目前我的代码中有以下内容,并尝试在没有for循环的情况下执行此操作,希望我可以从timestamp()正常工作。
raw_time = (data.variables['time'].getValue()/float(365*24))+1800 #hours since 1800
time = n.where((raw_time>=2006)&(time<=2016)) #our specific time interval
annual_time = []
for i in raw_time[time]:
annual_time.extend(datetime.datetime.fromtimestamp(i))
我的时间是从netCDF文件读入的,目前显示如下:
print raw_time[time]
array([ 2006.05205479, 2006.1369863 , 2006.22191781, 2006.29863014,
2006.38356164, 2006.46575342, 2006.55068493, 2006.63287671,
2006.71780822, 2006.80273973, 2006.88493151, 2006.96986301,
2007.05205479, 2007.1369863 , 2007.22191781, 2007.29863014,
2007.38356164, 2007.46575342, 2007.55068493, 2007.63287671,
2007.71780822, 2007.80273973, 2007.88493151, 2007.96986301,
2008.05205479, 2008.1369863 , 2008.22191781, 2008.30136986,
2008.38630137, 2008.46849315, 2008.55342466, 2008.63561644,
2008.72054795, 2008.80547945, 2008.88767123, 2008.97260274, ...])
答案 0 :(得分:1)
错误消息是因为您使用了extend
:
annual_time = []
for i in raw_time[time]:
annual_time.extend(datetime.datetime.fromtimestamp(i))
list .extend()
用于获取另一个列表或可迭代列表,并将其内容添加到列表的末尾。 datetime
不返回列表或可迭代;它返回一个datetime实例。对于标量值,您需要使用append
:
annual_time = []
for i in raw_time[time]:
annual_time.append(datetime.datetime.fromtimestamp(i))
话虽如此,我认为你需要在使用这个函数之前操纵时间值,因为你给出的值看起来不像时间戳(这是1970年1月1日00:00后的秒数: 00 UTC) - 除非那些时间真的应该是在1970年1月1日午夜后半小时......
答案 1 :(得分:1)
您应该使用netCDF4 num2date将time
从数值转换为datetime对象。
import netCDF4
ncfile = netCDF4.Dataset('./foo.nc', 'r')
time = ncfile.variables['time'] # do not cast to numpy array yet
time_convert = netCDF4.num2date(time[:], time.units, time.calendar)
这将创建一个time_convert
日期时间对象数组,然后您可以使用它们来生成季节。