因此,我正在创建一个考虑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
现在,我需要一些帮助:
- 在
tz
列中,您可以看到值只有01,我想知道如何在拆分tz
列时将"+"号包括在内
我知道我可以通过做来做到
df['tz'] = '+' + df['tz'].str.split(':').str[0]
但它看起来很乱。
- 在创建原始时间序列(
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