我有一个从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))
任何建议表示赞赏, 干杯!
答案 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。