检查 pandas 中的日期时间对象是否有时区?

Yaa*_*ler 6 python timezone datetime pandas

我正在将数据导入 pandas,并希望删除数据中存在的任何时区 \xe2\x80\x93。如果数据有时区,则以下代码可以成功运行:

\n
col = "my_date_column"\ndf[col] = pd.to_datetime(df[col]).dt.tz_localize(None) # We don\'t want timezones...\n
Run Code Online (Sandbox Code Playgroud)\n

如果数据不包含时区,我想使用以下代码:

\n
df[col] = pd.to_datetime(df[col])\n
Run Code Online (Sandbox Code Playgroud)\n

我的问题是我不确定如何测试 datetime object/series 中的时区

\n

MrF*_*pes 8

假设您有一个日期时间类型的列,您可以检查tzinfo该列中每个时间戳的。这里基本上描述了它(尽管这不是特定于pytz)。前任:

import pandas as pd

# example series:
s = pd.Series([
        pd.Timestamp("2020-06-06").tz_localize("Europe/Berlin"), # tzinfo defined
        pd.Timestamp("2020-06-07") # tzinfo is None
        ])

# s
# 0    2020-06-06 00:00:00+02:00
# 1          2020-06-07 00:00:00
# dtype: object
  
# now find a mask which is True where the timestamp has a timezone:
has_tz = s.apply(lambda t: t.tzinfo is not None)

# has_tz
# 0     True
# 1    False
# dtype: bool
Run Code Online (Sandbox Code Playgroud)


Acu*_*nus 6

这是建立在FObersteiner 之前的回答的基础上的。

如果列的类型为datetime64[ns],请使用Series.dt.tz

col.dt.tz is None
Run Code Online (Sandbox Code Playgroud)

如果列的类型为objectpd.Timestamp则它不支持.dt,因此请改用Timestamp.tz

col.apply(lambda t: t.tz is None).all()
Run Code Online (Sandbox Code Playgroud)