如何在Pandas处理夏令时夏令时而不会出现时间不明确或不存在时间错误



我使用的是必须处理夏令时(DST(的大型数据集。这是我在stackoverflow上间接找到的一个解决方案。我试图更直接地回答这个问题,这样其他人就能更快地找到它。

问题和设置。基本上,如何将panda中的日期时间列转换为特定时区或UTC。如果夏令时没有日期时间,这很容易。但对于夏令时,必须采取一些额外的步骤。

数据集:

2012-03-24 23:00;    4.9741
2012-03-25 00:00;    4.9443
2012-03-25 01:00;    4.9443
2012-03-25 02:00;    4.9160
2012-03-25 03:00;    4.8865
2012-03-25 04:00;    4.8865
2012-03-25 05:00;    4.8584
2012-10-27 22:00;    2.1982
2012-10-27 23:00;    2.1982
2012-10-28 00:00;    2.1982
2012-10-28 01:00;    2.1839
2012-10-28 02:00;    2.1839
2012-10-28 03:00;    2.1982
2012-10-28 04:00;    2.1839
2012-10-28 05:00;    2.1839

现在有春季和秋季夏令时的数据数据以csv形式出现,并已加载和准备:

import pandas 
df = pandas.read_csv('data_file_path', sep=';', encoding='utf-8')
def column_names(df):
df.columns=['Time', 'Value']
return df
df = column_names(df)
def change_str_column_to_float(df):
df['Value'] = pandas.to_numeric(df['Value'])
return df
df = change_str_column_to_float(df)

数据现在已清理并准备就绪。现在介绍如何将时间转换为UTC时间或特定时区。

数据来自挪威,但收到时没有应用挪威时区。我想应用挪威时区,如有必要,请将其转换为UTC因此,有两种可能的解决方案。两者都有:

import pytz
def add_norwegian_timezone(df):
timeZone = pytz.timezone("Europe/Oslo")
df['Time'] = df['Time'].dt.tz_localize('UTC')
df['Time'] = df['Time'].dt.tz_convert(timeZone)
return df
def convert_to_utc(df):
timeZone = pytz.timezone("Europe/Oslo")
df['Time'] = df['Time'].dt.tz_localize('UTC')
df['Time'] = df['Time'].dt.tz_convert(timeZone)
df['Time'] = df['Time'].dt.tz_convert('UTC')
return df

我发现有趣的一点是,当pandas datetime列中没有定义时区时,您必须首先应用UTC时区(df['Time']=df['Time'].dt.tz_localize('UTC'((。然后应用该数据集的实际时区(df[Time']=df['Time'].dt.z_convert(时区((。在本例中,您将在本地时区中获得数据,即挪威时区。如果您希望数据使用UTC格式,则将其转换回UTC(df['Time']=df['Time'].dt.tz_convert('UTC'((。

奇怪的是,你必须执行这些步骤,但我发现这是让panda在不出现歧义时间或不存在时间错误的情况下解释DST的唯一方法。

我确信这是正确的,当我运行它时,日期时间转换正确,没有发现错误。但我希望得到反馈,以确保我向社区分享了正确的信息,并且没有错过什么。

谢谢:(

最新更新