![](/img/trans.png)
[英]Convert datetime.datetime object to days since epoch in Python
[英]Python: convert 'days since 1990' to datetime object
我有一個時間序列,我從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的發展方式。 在Python 3中,您需要使用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 datetime對象。 如果time
沒有calendar
屬性,則需要指定日歷,或使用默認的標准。
我們可以分幾步完成。 首先,我們將使用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。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.