如何有效地拆分日期时间列,以便在新列中包含时区



因此,我正在创建一个考虑DST的年度时间序列数据,如下所示:

import pandas as pd
sd = '2020-01-01'
ed = '2021-01-01'
df = pd.date_range(sd, ed, freq='0.25H', tz='Europe/Berlin')
df = df.to_frame().reset_index(drop=True)
df.rename(columns={0:'dates'}, inplace=True)

dates列还包含时区(+1(CET(和+2(CEST((。现在,我想以这样的方式拆分dates列,即在dates列中,只有格式的日期(YYYY-MM-DD HH:MM(,并创建一个名为tz的新列,它必须具有字符串形式的时区,即+01+02

我做到了:

df['dates'] = df['dates'].apply(lambda t: str(t))
df['tz'] = df['dates'].str.split('+').str[1]
df['tz'] = df['tz'].str.split(':').str[0]
df['dates'] = pd.to_datetime(df['dates'])
df['dates'] = df['dates'].apply(lambda t: t.strftime('%Y-%m-%d %H:%M'))

这给了我如下的输出:

dates   tz
2020-01-01 00:00    01
2020-01-01 00:15    01
2020-01-01 00:30    01
2020-01-01 00:45    01
2020-01-01 01:00    01
2020-01-01 01:15    01
2020-01-01 01:30    01

现在,我需要一些帮助:

  1. tz列中,您可以看到值只有01,我想知道如何在拆分tz列时将"+"号包括在内

我知道我可以通过做来做到

df['tz'] = '+' + df['tz'].str.split(':').str[0]

但它看起来很乱。

  1. 在创建原始时间序列(pd.date_range(sd, ed, freq='0.25H', tz='Europe/Berlin')(后,是否有更有效的方法将列拆分为所需输出

所需输出

dates   tz
2020-01-01 00:00    +01
2020-01-01 00:15    +01
2020-01-01 00:30    +01
2020-01-01 00:45    +01
2020-01-01 01:00    +01
2020-01-01 01:15    +01
2020-01-01 01:30    +01

通常,我建议不要将日期时间类型存储为字符串,尤其是那些非标准格式的类型。然而,如果你坚持,你可以做:

# from the original dataframe
df['tz'] = df['dates'].astype(str).str.extract(r'(+d{2})')[0]
df['dates'] = df['dates'].dt.strftime('%Y-%m-%d %H:%M')

或者只有一个具有更复杂正则表达式的提取:

df['tz'] = ''
df[['dates', 'tz']] = df['dates'].astype(str).str.extract(r'([d- :]+):d{2}(.+):')

输出(头(:

dates   tz
0  2020-01-01 00:00  +01
1  2020-01-01 00:15  +01
2  2020-01-01 00:30  +01
3  2020-01-01 00:45  +01
4  2020-01-01 01:00  +01

最新更新