簡體   English   中英

將 zoneinfo 與 pandas.date_range 一起使用

[英]Using zoneinfo with pandas.date_range

我正在嘗試使用zoneinfo而不是pytz 我在使用zoneinfo啟動日期並將其傳遞給pd.date_range時遇到問題。

下面是一個用pytzzoneinfo做同樣事情的例子。 但是,在將它傳遞給pd.date_range時,后者出現錯誤。

皮茨示例:

start_date = datetime(2021, 1, 1, 0, 0, 0)end_date = datetime(2024, 1, 1, 0, 0, 0) # exclusive end range
pt = pytz.timezone('Canada/Pacific')start_date = pt.localize(start_date)end_date = pt.localize(end_date)
pd.date_range(start_date, end_date-timedelta(days=1), freq='d')

區域信息示例:

start_date1 = '2021-01-01 00:00:00
start_date1 = datetime.strptime(start_date1, '%Y-%m-%d %H:%M:%S').replace(microsecond=0, second=0, minute=0, tzinfo=ZoneInfo("America/Vancouver"))end_date1 = start_date1 + relativedelta(years=3)
pd.date_range(start_date1, end_date1-timedelta(days=1), freq='d')

但是,在使用zoneinfo時出現以下錯誤:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
~/Documents/GitHub/virtual/lib/python3.9/site-packages/pandas/_libs/tslibs/timezones.pyx in pandas._libs.tslibs.timezones.get_dst_info()

AttributeError: 'NoneType' object has no attribute 'total_seconds'

Exception ignored in: 'pandas._libs.tslibs.tzconversion.tz_convert_from_utc_single'
Traceback (most recent call last):
  File "pandas/_libs/tslibs/timezones.pyx", line 266, in pandas._libs.tslibs.timezones.get_dst_info
AttributeError: 'NoneType' object has no attribute 'total_seconds'
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
~/Documents/GitHub/virtual/lib/python3.9/site-packages/pandas/_libs/tslibs/timezones.pyx in pandas._libs.tslibs.timezones.get_dst_info()

AttributeError: 'NoneType' object has no attribute 'total_seconds'

Exception ignored in: 'pandas._libs.tslibs.tzconversion.tz_convert_from_utc_single'
Traceback (most recent call last):
  File "pandas/_libs/tslibs/timezones.pyx", line 266, in pandas._libs.tslibs.timezones.get_dst_info
AttributeError: 'NoneType' object has no attribute 'total_seconds'
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
/var/folders/vp/7ptlp5l934vdh1lvmpgk4qyc0000gn/T/ipykernel_67190/3566591779.py in <module>
      5 end_date1 = start_date1 + relativedelta(years=3)
      6 
----> 7 pd.date_range(start_date1, end_date1-timedelta(days=1), freq='d')
      8 
      9 # Because certain distributions will be a result of combined distributions,

~/Documents/GitHub/virtual/lib/python3.9/site-packages/pandas/core/indexes/datetimes.py in date_range(start, end, periods, freq, tz, normalize, name, closed, **kwargs)
   1095         freq = "D"
   1096 
-> 1097     dtarr = DatetimeArray._generate_range(
   1098         start=start,
   1099         end=end,

~/Documents/GitHub/virtual/lib/python3.9/site-packages/pandas/core/arrays/datetimes.py in _generate_range(cls, start, end, periods, freq, tz, normalize, ambiguous, nonexistent, closed)
    450 
    451             if tz is not None and index.tz is None:
--> 452                 arr = tzconversion.tz_localize_to_utc(
    453                     index.asi8, tz, ambiguous=ambiguous, nonexistent=nonexistent
    454                 )

~/Documents/GitHub/virtual/lib/python3.9/site-packages/pandas/_libs/tslibs/tzconversion.pyx in pandas._libs.tslibs.tzconversion.tz_localize_to_utc()

~/Documents/GitHub/virtual/lib/python3.9/site-packages/pandas/_libs/tslibs/timezones.pyx in pandas._libs.tslibs.timezones.get_dst_info()

AttributeError: 'NoneType' object has no attribute 'total_seconds'

測試參數:

start_date==start_date1

end_date==end_date1兩個測試的結果都是True

如果理解正確,您想使用 ZoneInfo 創建一個日期范圍(一維頻率)……如果正確,我會看到您的代碼發生了一些變化。

#1 在處理日期時間時,確保 object 的數據類型正確。 我相信 datetime64 格式會更好用。

#2 從提供的代碼來看,我認為不需要“strptime”或“replace”。 要在 ZoneInfo 中訪問“America/Vancouver”,如果將 start_date1 解析為年、月、日、小時和分鍾,則可以使其正常工作。

#3 解析 start_date1 時,您可以將年份(或其他數字)加 3 以創建結束日期。

以上將在指定范圍內創建 DatetimeIndex。

日期時間總是很棘手。 與往常一樣,您可以使用不同的路徑到達同一目的地……這只是其中之一。

start_date_str = '2021-01-01 00:00:00'
start_date_datetime64 = pd.to_datetime(start_date_str) # change dtype  to datetime64

year = start_date_datetime64.year
month = start_date_datetime64.month
day = start_date_datetime64.day
hour = start_date_datetime64.hour
minute = start_date_datetime64.minute

start_date_formatted = dt.datetime(year, month, day, hour, minute, tzinfo=ZoneInfo("America/Vancouver"))
end_date_formatted = dt.datetime(year + 3, month, day, hour, minute, tzinfo=ZoneInfo("America/Vancouver"))

result = pd.date_range(start_date_formatted, end_date_formatted-pd.Timedelta(days=1), freq='d')

輸出- DatetimeIndex, dtype='datetime64[ns, America/Vancouver]', length=1095, freq='D')

此錯誤是pandas版本與nbformat版本之間兼容的結果。 一旦我將兩者都更新到最新版本,代碼就可以正常工作了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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