簡體   English   中英

Pandas isin holidays.country_holidays 在第一次嘗試時錯誤地僅返回 False,但在第二次嘗試時返回正確的結果

[英]Pandas isin holidays.country_holidays incorrectly returns only False on 1st attempt but correct results on 2nd attempt

在檢查本地日期是否為本地假期時,我正在努力解決 pandas.isin 的行為。

我有一個帶有 utc 時間戳的 data.frame X ,我將其轉換為本地日期並在x_daily中每個日期只保留一行:

import pandas as pd
import holidays

X = pd.DataFrame({'timestampUtc': pd.date_range("2000-12-25", "2001-01-06", freq="1440min", tz="utc")})
X['local_date'] = X['timestampUtc'].dt.tz_convert(tz='Europe/Berlin').dt.date
x_daily = X[['local_date']].drop_duplicates()

不,它變得很奇怪:當我嘗試使用.isin查找當地假期時,它沒有找到。 當我用in檢查local_date的每個元素時,會正確找到所有假期。 之后再次調用.isin也會找到正確的假期。

de_holidays = holidays.country_holidays(country='DE', state='BW')
# 1st try: no holidays found with isin
x_daily['local_date'].isin(de_holidays)
# correct holidays found with list comprehension and 'in'
[x_daily['local_date'].iloc[i] in de_holidays for i in range(x_daily.shape[0])]
# 2nd try: correct holidays found with isin
x_daily['local_date'].isin(de_holidays)

分配邏輯列來標識我當地的假期的可靠且有效的方法是什么?

我在這里再次將整個代碼粘貼到一個塊中:

import pandas as pd
import holidays

X = pd.DataFrame({'timestampUtc': pd.date_range("2000-12-25", "2001-01-06", freq="1440min", tz="utc")})
X['local_date'] = X['timestampUtc'].dt.tz_convert(tz='Europe/Berlin').dt.date
x_daily = X[['local_date']].drop_duplicates()

de_holidays = holidays.country_holidays(country='DE', state='BW')
# 1st try: no holidays found with isin
x_daily['local_date'].isin(de_holidays)
# correct holidays found with list comprehension and 'in'
[x_daily['local_date'].iloc[i] in de_holidays for i in range(x_daily.shape[0])]
# 2nd try: correct holidays found with isin
x_daily['local_date'].isin(de_holidays)

這是我的控制台 output: 在此處輸入圖像描述

假期模塊的文檔說:

為了最大限度地提高速度,假期列表是根據需要動態構建的,一次一個日歷年。 當您實例化 object 時,它是空的,但一旦訪問一個鍵,它將構建整年的假期列表。 要預填充假期,請使用 years 參數實例化 class:

us_holidays = holidays.US(years=2020)

也就是說,您必須先訪問該列表,然后它才會開始填充它。

isin的實現將首先轉換為列表的參數,在您的情況下,這將導致一個空列表。

您可以將代碼更改為

de_holidays = holidays.country_holidays(country='DE', state='BW', years=[2000, 2001])

它應該按預期工作。

暫無
暫無

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

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