【问题标题】:Pandas to_datetime and datetime not equal for same date with same timezonePandas to_datetime 和 datetime 对于具有相同时区的相同日期不相等
【发布时间】:2022-02-20 03:12:56
【问题描述】:

在比较两个日期时我会发疯——一个是 pd_todatetime 对象,另一个是 python datetime 对象。两者都有相同的日期和时区,但仍然比较显示不平等。下面是两个对象:

Timestamp('2022-02-17 09:15:00+0530', tz='Asia/Kolkata')

datetime.datetime(2022, 2, 17, 9, 15, tzinfo=<DstTzInfo 'Asia/Kolkata' LMT+5:53:00 STD>)

第一个是pd.to_datetime索引,后者是python datetime对象。

以下是原始数据:

from pytz import timezone

IST = timezone('Asia/Kolkata')
data = {'date': datetime.datetime(2022, 2, 17, 9, 15, tzinfo=tzoffset(None, 19800)),  'open': 150,  'high': 203.75,  'low': 150,  'close': 191.45, 'volume': 185050,  'oi': 1735100}

df = pd.DataFrame(dat)

if df.date.dt.tz == None:
    df['date'] = df.date.dt.tz_localize(IST)
else:
    df['date'] = df.date.dt.tz_convert(IST)

df.set_index("date", inplace=True)
start = datetime(2022,2,17,9,15,0, tzinfo=IST)

if df.index.min() == start:
    do_something()

这是 if 语句被评估为 False 的地方

【问题讨论】:

  • 你能提供最少的代码来创建和比较这两个对象吗?这可能会有所帮助。
  • 显示您的原始 CSV 输入文本和预期的原始 CSV 输出文本。可能还有其他方法可以做到这一点,我们可以从原始格式中确定
  • Bill - 请查看已编辑的代码 sn-p
  • 如果你使用来自 pytz 的时区对象,你必须本地化;例如IST.localize(datetime.datetime(2022, 2, 17, 9, 15))。否则,将使用本地平均时间 (LMT) - 请注意示例中 5:53 小时的 UTC 偏移量!

标签: python pandas datetime timestamp


【解决方案1】:

你不能使用pandas.Timestamp,就像解释在:

Timestamp 是 python 的 Datetime 的 pandas 等价物,是 在大多数情况下可以与它互换。这是用于 构成 DatetimeIndex 和其他时间序列的条目 pandas 中的数据结构。

https://pandas.pydata.org/docs/reference/api/pandas.Timestamp.html

【讨论】:

  • 谢谢佩德罗,我试过了,但没用。
【解决方案2】:

我以前从未使用过 pytz,但我想我已经复制了您的问题:

import pytz

a = pd.Timestamp('2022-02-17 09:15:00', tz='Asia/Kolkata')
b = datetime.datetime(2022, 2, 17, 9, 15, tzinfo=pytz.timezone('Asia/Kolkata'))
assert(a == b)  # False

请注意为什么这些不相等。可能与this note in the documentation有关。

您可以使用新内置的zoneinfo 模块(在 Python 3.9 版本中引入)吗?

from zoneinfo import ZoneInfo

c = datetime.datetime(2022, 2, 17, 9, 15, tzinfo=ZoneInfo('Asia/Kolkata'))
assert(a == c)  # True

【讨论】:

  • 谢谢比尔。使用 pandas datetime 和 pythons datetime 似乎存在严重问题。 pandas datetime 不支持某些东西,因此需要使用 datetime.datetime。调和这两者变得非常痛苦。希望熊猫在这方面做得更好
  • 请注意,pytz 是第三方包。阅读PEP-615。它解释了一个长期存在的问题,我认为这可能是这个问题的核心。如果比我有更多约会时间经验的人可以发表评论,那就太好了。我很少使用时区。
  • "我以前从未使用过 pytz" - 好吧,请参阅我在问题下的评论。你实际上是在重复错误的代码;-) 但是如果你问我,zoneinfo 是更好的方法;没有这样的警告。
  • @FObersteiner 太好了,感谢您的解释。如果有人没有 zoneinfo (Python 3.9) 是否有使用 pytz 的替代方法?他们不能只使用UTC偏移或其他东西吗?
  • backports.zoneinfo,还有一个 pytz 的折旧垫片,用于遗留代码
猜你喜欢
  • 1970-01-01
  • 2015-05-16
  • 1970-01-01
  • 1970-01-01
  • 2021-02-06
  • 2013-03-06
  • 2021-03-01
  • 1970-01-01
  • 2012-04-15
相关资源
最近更新 更多