[英]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)
假期模塊的文檔說:
為了最大限度地提高速度,假期列表是根據需要動態構建的,一次一個日歷年。 當您實例化 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.