pandas 如何在Python中检查给定时区中是否存在日期时间?

mjqavswn  于 2023-05-12  发布在  Python
关注(0)|答案(1)|浏览(164)

我需要读取作为数据框提供给我的CSV温度数据。date列应该是本地化的欧洲/巴黎时区,但即使由于夏令时,数据提供程序也会提供数据。如果我跑:

import pandas as pd
from io import StringIO
from pytz import timezone

csv_string = StringIO("date;temp\n\
2014-03-29 22:00:00;12,5\n\
2014-03-29 23:00:00;12,4\n\
2014-03-30 00:00:00;10,7\n\
2014-03-30 01:00:00;11,7\n\
2014-03-30 02:00:00;12,4\n\
2014-03-30 03:00:00;12,4\n\
2014-03-30 04:00:00;10,7\n\
2014-03-30 05:00:00;10,4\n\
2014-03-30 06:00:00;9,4")

df = pd.read_csv(csv_string, sep=";", decimal=",")
df["date"] = pd.to_datetime(df["date"], infer_datetime_format=True)
df.set_index("date", inplace=True)
df.index = df.index.tz_localize(timezone('Europe/Paris'))

我得到:
pytz.exceptions.NonExistentTimeError:2014-03-30 02:00:00
我正在寻找一种方法来删除行,这将提高NonExistentTimeError。如何使用pandas、pytz或其他lib测试这些行?

iqxoj9l9

iqxoj9l91#

最后,我得到了以下结果:

import pandas as pd
from io import StringIO
from pytz import timezone

csv_string = StringIO("date;temp\n\
2014-03-29 22:00:00;12,5\n\
2014-03-29 23:00:00;12,4\n\
2014-03-30 00:00:00;10,7\n\
2014-03-30 01:00:00;11,7\n\
2014-03-30 02:00:00;12,4\n\
2014-03-30 03:00:00;12,4\n\
2014-03-30 04:00:00;10,7\n\
2014-03-30 05:00:00;10,4\n\
2014-03-30 06:00:00;9,4")

def datetime_exists_in_tz(dt, tz):
    try:
        dt.tz_localize(tz)
        return True
    except:
        return False

df = pd.read_csv(csv_string, sep=";", decimal=",")
df["date"] = pd.to_datetime(df["date"], infer_datetime_format=True)
df = df.loc[df["date"].apply(datetime_exists_in_tz, tz=timezone('Europe/Paris'))]
df.set_index("date", inplace=True)
df.index = df.index.tz_localize(timezone('Europe/Paris'))

仍然开放给更优雅和更有效的解决方案:)

相关问题