我从netCDF文件中提取了一个时间序列,并试图将其转换为日期时间格式。时间序列的格式为"自1990-01-01 00:00:00+10以来的天数"(+10为GMT:+10)
time = nc_data.variables['time'][:]
time_idx = 0 # first timestamp
print time[time_idx]
9465.0
我想要的输出是这样的日期时间对象(也是GMT+10):
"2015-12-01 00:00:00"
我曾尝试使用时间模块转换它,但没有取得多大成功,尽管我认为我可能使用错了(我仍然是python和编程的新手)。
import time
time_datetime = time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(time[time_idx]*24*60*60))
感谢您的任何建议,干杯
datetime
模块的timedelta
可能就是您想要的。
例如:
from datetime import date, timedelta
days = 9465 # This may work for floats in general, but using integers
# is more precise (e.g. days = int(9465.0))
start = date(1990,1,1) # This is the "days since" part
delta = timedelta(days) # Create a time delta object from the number of days
offset = start + delta # Add the specified number of days to 1990
print(offset) # >>> 2015-12-01
print(type(offset)) # >>> <class 'datetime.date'>
然后,您可以使用和/或操作偏移对象,或者将其转换为您认为合适的字符串表示形式。
您可以对此日期对象使用与time_datetime
:相同的格式
print(offset.strftime('%Y-%m-%d %H:%M:%S'))
输出:
2015-12-01 00:00:00
不使用date
对象,而是可以使用datetime
对象,例如,如果稍后要添加小时/分钟/秒/时区偏移量。
代码将保持与上面相同,除了两行:
# Here, you're importing datetime instead of date
from datetime import datetime, timedelta
# Here, you're creating a datetime object instead of a date object
start = datetime(1990,1,1) # This is the "days since" part
注意:虽然您没有说明,但另一个答案表明您可能正在寻找具有时区意识的日期时间。如果是这样的话,dateutil
是Python 2中的最佳选择,正如另一个答案所建议的那样。在Python3中,您可能希望使用datetime
模块的tzinfo
。
netCDF num2date是此处使用的正确函数:
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)
这将把1900-01-01以来的天数(即time
的units
)转换为python日期时间对象。如果time
没有calendar
属性,则需要指定日历,或者使用默认的标准。
我们可以通过几个步骤来做到这一点。首先,我们将使用dateutil
库来处理我们的工作。这会让一些事情变得更容易。
第一步是从字符串(1990-01-01 00:00:00 +10
)中获取一个datetime
对象。我们将使用以下代码:
from datetime import datetime
from dateutil.relativedelta import relativedelta
import dateutil.parser
days_since = '1990-01-01 00:00:00 +10'
days_since_dt = dateutil.parser.parse(days_since)
现在,我们的days_since_dt
将是这样的:
datetime.datetime(1990, 1, 1, 0, 0, tzinfo=tzoffset(None, 36000))
我们将在下一步确定新日期时使用它。我们将在dateutils中使用relativedelta
来处理此数学运算。
new_date = days_since_dt + relativedelta(days=9465.0)
这将导致您在new_date
中的值为:
datetime.datetime(2015, 12, 1, 0, 0, tzinfo=tzoffset(None, 36000))
此方法可确保您收到的答案继续处于GMT+10。