Python:将'1990年以来的天数'转换为datetime对象

时间:2016-08-01 05:25:23

标签: python datetime

我有一个从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))

任何建议表示赞赏, 干杯!

3 个答案:

答案 0 :(得分:4)

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的方法。在Python 3中,您希望使用datetime模块tzinfo

答案 1 :(得分:4)

http://aa.usno.navy.mil/faq/docs/easter.php是在这里使用的正确函数:

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以来的天数(即units的{​​{1}})转换为python datetime对象。如果time没有time属性,则您需要指定日历,或使用默认的标准。

答案 2 :(得分:2)

我们可以分几步完成。首先,我们将使用dateutil库来处理我们的工作。这将使一些更容易。

第一步是从字符串中获取datetime对象(1990-01-01 00:00:00 +10)。我们将使用以下代码执行此操作:

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。