以下是在 Python 3.9.7 中生成的。
datetime我很清楚,在 Python 中不允許tz-aware 和 naive 實體之間的比較,并且會引發TypeError. 但是,在測驗相等性時(使用==and!=運算子)實際上并非如此。事實上,比較總是回傳False:
import datetime
import pytz
t_tz_aware = datetime.datetime(2020, 5, 23, tzinfo=pytz.UTC)
t_naive = datetime.datetime(2020, 5, 23)
# Prints 'False'.
print(t_tz_aware == t_naive)
# Raises TypeError: can't compare offset-naive and offset-aware datetimes.
print(t_tz_aware < t_naive)
我檢查了庫的源代碼,datetime用于比較日期時間物件的函式有一個名為allow_mixed(默認為False)的引數:
def _cmp(self, other, allow_mixed=False)
當設定為 時True,即使用==運算子進行比較時的情況,可以比較 tz-aware 和 naivedatetime實體。否則,它會引發 TypeError:
# When testing for equality, set allow_mixed to True.
# For all the other operators, it remains False.
def __eq__(self, other):
if isinstance(other, datetime):
return self._cmp(other, allow_mixed=True) == 0
if myoff is None or otoff is None:
if allow_mixed:
return 2 # arbitrary non-zero value
else:
raise TypeError("cannot compare naive and aware datetimes")
所以,這看起來確實是預期的行為。事實上,Pandas 對pandas.Timestamps和相似的比較的實作與此是一致的。
我的問題是,原因是什么?我想,就像引數名稱所說的那樣,我們可以過濾datetime包含天真和 tz 感知實體的物件集合(即“混合”)。但這不會只是引入潛在錯誤和意外行為的來源嗎?我錯過了什么?
在 deceze 的評論之后編輯:這實際上仍然是“語意正確的”(即,日期肯定不同)。
uj5u.com熱心網友回復:
相等比較幾乎不會引發例外。您只想知道物件A是否等于物件B,這有一個明確的答案。如果它們相等,但這些物件定義相等,答案是yes,在所有其他情況下它是no。至少在一個有時區而另一個沒有時區的情況下,一個天真datetime者與一個有意識的人不同,因此它們顯然不相等。
但是,對于大于/小于比較,物件顯然需要是可排序的,否則無法回答問題。比較<不能False僅僅因為物件不能被比較而回傳,因為這意味著相反的>=比較應該回傳True,它也不能。因此,在這種情況下提出錯誤是正確的第三種可能結果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/468415.html
上一篇:Pandas隨機資料選擇
下一篇:如何從逐行計算中填充資料框?
