为了账号安全,请及时绑定邮箱和手机立即绑定

如何根据年份在熊猫数据帧中创建多个列

如何根据年份在熊猫数据帧中创建多个列

一只斗牛犬 2022-10-05 09:23:06
我有10年的每小时水位数据,我试图根据年份在单独的列中排列。数据的当前格式分为两列,一列用于读数的日期和时间(例如 06/04/1989 06:00:00),另一列用于水位。我想根据年份将数据分成单独的列。我认为这是一项简单的任务,但由于我在熊猫方面的经验有限,我发现它具有挑战性。任何建议将不胜感激。输入:Obs_date         SLEV(metres)31/12/1990 20:00    0.1531/12/1990 21:00    0.1431/12/1990 22:00    0.1331/12/1990 23:00    0.16...31/12/1991 20:00    0.1231/12/1991 21:00    0.1331/12/1991 22:00    0.0931/12/1991 23:00    0.08输出:Obs_date          1990   1991   31-Dec 20:00:00   0.15   0.1231-Dec 21:00:00   0.14   0.1331-Dec 22:00:00   0.13   0.0931-Dec 23:00:00   0.16   0.08
查看完整描述

1 回答

?
繁花如伊

TA贡献2012条经验 获得超12个赞

首先按to_datetime转换为日期时间,然后按系列.dt.年份创建新列,通过系列.dt.strftime创建自定义格式,最后通过DataFrame.pivot进行透视,并将索引转换为列DataFrame.reset_indexDataFrame.rename_axis用于删除列名称:Obs_date

df['Obs_date'] = pd.to_datetime(df['Obs_date'], format='%d/%m/%Y %H:%M')

df['year'] = df['Obs_date'].dt.year

df['Obs_date'] = df['Obs_date'].dt.strftime('%d-%b %H:%M:%S')


df = df.pivot('Obs_date', 'year','SLEV(metres)').reset_index().rename_axis(None, axis=1)

print (df)

          Obs_date  1990  1991

0  31-Dec 20:00:00  0.15  0.12

1  31-Dec 21:00:00  0.14  0.13

2  31-Dec 22:00:00  0.13  0.09

3  31-Dec 23:00:00  0.16  0.08

或者可以创建系列,并通过DataFrame.set_index系列.unstack进行重塑:yd


df['Obs_date'] = pd.to_datetime(df['Obs_date'], format='%d/%m/%Y %H:%M')

y = df['Obs_date'].dt.year

d = df['Obs_date'].dt.strftime('%d-%b %H:%M:%S')


df = df.set_index([d, y])['SLEV(metres)'].unstack().reset_index().rename_axis(None, axis=1)

print (df)

          Obs_date  1990  1991

0  31-Dec 20:00:00  0.15  0.12

1  31-Dec 21:00:00  0.14  0.13

2  31-Dec 22:00:00  0.13  0.09

3  31-Dec 23:00:00  0.16  0.08

如果需要稍后处理数据并且需要正确的顺序,最好将日期时间转换为具有某些默认年份,例如:DatetimeIndex29.February2020


df['Obs_date'] = pd.to_datetime(df['Obs_date'], format='%d/%m/%Y %H:%M')

y = df['Obs_date'].dt.year

d = pd.to_datetime(df['Obs_date'].dt.strftime('2020-%m-%d %H:%M:%S'))


df = df.set_index([d, y])['SLEV(metres)'].unstack().rename_axis(None, axis=1)

print (df)

                     1990  1991

Obs_date                       

2020-12-31 20:00:00  0.15  0.12

2020-12-31 21:00:00  0.14  0.13

2020-12-31 22:00:00  0.13  0.09

2020-12-31 23:00:00  0.16  0.08


查看完整回答
反对 回复 2022-10-05
  • 1 回答
  • 0 关注
  • 89 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号