Python:将'days since 1990'转换为日期时间对象



我从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以来的天数(即timeunits)转换为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。

相关内容

  • 没有找到相关文章

最新更新