簡體   English   中英

Python:將'1990年以來的天數'轉換為datetime對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM