熊猫映射列

时间:2017-10-17 12:14:36

标签: python pandas dataframe

我的数据框如下所示:

 DATE        INTV        Y
2005-11-10 00:00:00.000 0
2005-11-10 00:30:00.000 0
2005-11-10 01:00:00.000 0
2005-11-10 01:30:00.000 1
2005-11-10 02:00:00.000 1
2005-11-10 02:30:00.000 0
...
2005-11-10 22:00:00.000 1
2005-11-10 22:30:00.000 3
2005-11-10 23:00:00.000 3
2005-11-10 23:30:00.000 0

我想像这样重新制作INTV专栏:

00:00:00.000 = 1
00:30:00.000 = 2
01:00:00.000 = 3
01:30:00.000 = 4
...
23:00:00.000 = 47
23:30:00.000 = 48

我尝试使用字典和.map函数,但这并不是我想要的。

3 个答案:

答案 0 :(得分:1)

假设INTV列是datetime列,那么这是微不足道的,

df.INTV = df.INTV.dt.hour * 2 + df.INTV.dt.minute/30 + 1

假设它是datetime.time列,因为pandas dt不支持datetime.time个对象,它会变得有点小问题,

df.INTV = pd.to_datetime(df.Date.dt.strftime('%Y-%m-%d ') + df.INTV.astype(str)))
df.INTV = df.INTV.dt.hour * 2 + df.INTV.dt.minute/30 + 1

在这里,我们只需从datetimeDate列中创建一个虚拟INTV对象,然后按上述方式提取小时和分钟。

答案 1 :(得分:1)

按字典使用map,使用相同的格式split并按str[0]选择第一个列表:

d = dict(zip(pd.date_range('2015-01-01', '2015-01-01 23:59:59', freq='30T')
               .strftime('%H:%M:%S'), range(1, 49)))

print (d)

{'00:30:00': 2, '13:30:00': 28, '07:00:00': 15, '19:30:00': 40, '12:00:00': 25, 
'10:30:00': 22, '01:30:00': 4, '14:30:00': 30, '21:00:00': 43, '11:00:00': 23, 
'16:00:00': 33, '06:30:00': 14, '05:00:00': 11, '03:00:00': 7, '20:00:00': 41, 
'06:00:00': 13, '01:00:00': 3, '18:00:00': 37, '15:00:00': 31, '09:00:00': 19, 
'19:00:00': 39, '02:30:00': 6, '23:00:00': 47, '02:00:00': 5, '08:30:00': 18, 
'14:00:00': 29, '17:00:00': 35, '13:00:00': 27, '21:30:00': 44, '04:30:00': 10, 
'07:30:00': 16, '18:30:00': 38, '16:30:00': 34, '23:30:00': 48, '00:00:00': 1, 
'17:30:00': 36, '05:30:00': 12, '10:00:00': 21, '11:30:00': 24, '15:30:00': 32, 
'22:00:00': 45, '20:30:00': 42, '04:00:00': 9, '09:30:00': 20, '03:30:00': 8, 
'08:00:00': 17, '12:30:00': 26, '22:30:00': 46}

df['new']=df['INTV'].str.split('.').str[0].map(d)
print (df)
         DATE          INTV  Y  new
0  2005-11-10  00:00:00.000  0    1
1  2005-11-10  00:30:00.000  0    2
2  2005-11-10  01:00:00.000  0    3
3  2005-11-10  01:30:00.000  1    4
4  2005-11-10  02:00:00.000  1    5
5  2005-11-10  02:30:00.000  0    6
6  2005-11-10  22:00:00.000  1   45
7  2005-11-10  22:30:00.000  3   46
8  2005-11-10  23:00:00.000  3   47
9  2005-11-10  23:30:00.000  0   48

详情:

print (df['INTV'].str.split('.').str[0])
0    00:00:00
1    00:30:00
2    01:00:00
3    01:30:00
4    02:00:00
5    02:30:00
6    22:00:00
7    22:30:00
8    23:00:00
9    23:30:00
Name: INTV, dtype: object

另一个改进的josh解决方案:

dates = pd.to_datetime(df['INTV'])
df['new']= dates.dt.hour * 2 + dates.dt.minute//30 + 1
print (df)
         DATE          INTV  Y  new
0  2005-11-10  00:00:00.000  0    1
1  2005-11-10  00:30:00.000  0    2
2  2005-11-10  01:00:00.000  0    3
3  2005-11-10  01:30:00.000  1    4
4  2005-11-10  02:00:00.000  1    5
5  2005-11-10  02:30:00.000  0    6
6  2005-11-10  22:00:00.000  1   45
7  2005-11-10  22:30:00.000  3   46
8  2005-11-10  23:00:00.000  3   47
9  2005-11-10  23:30:00.000  0   48

详细信息 - 日期并不重要,如果今天只添加解析时间:

print (dates)
0   2017-10-17 00:00:00
1   2017-10-17 00:30:00
2   2017-10-17 01:00:00
3   2017-10-17 01:30:00
4   2017-10-17 02:00:00
5   2017-10-17 02:30:00
6   2017-10-17 22:00:00
7   2017-10-17 22:30:00
8   2017-10-17 23:00:00
9   2017-10-17 23:30:00
Name: INTV, dtype: datetime64[ns]

答案 2 :(得分:0)

你应该能够定义一个"重映射"用于进行所需的更改,然后将其应用于INTV系列。

df['INTV']=df['INTV'].apply(remap_func)