Python:Numpy和Pandas将时间戳/数据转换为单热编码

时间:2017-10-06 13:49:28

标签: python pandas date numpy encoding

我有一个像这样的数据框列

              time
0       2017-03-01 15:30:00
1       2017-03-01 16:00:00
2       2017-03-01 16:30:00
3       2017-03-01 17:00:00
4       2017-03-01 17:30:00
5       2017-03-01 18:00:00
6       2017-03-01 18:30:00
7       2017-03-01 19:00:00
8       2017-03-01 19:30:00
9       2017-03-01 20:00:00
10      2017-03-01 20:30:00
11      2017-03-01 21:00:00
12      2017-03-01 21:30:00
13      2017-03-01 22:00:00
.
.
.

我想"编码"一天的时间。我想通过首先将每半个小时分配一个整数来做到这一点。从

开始
 00:30:00 --> 1
 01:00:00 --> 2
 01:30:00 --> 3
 02:00:00 --> 4
 02:30:00 --> 5

等等。因此,我们会有48个数字(因为有24小时)。我想找到将列重新转换为包含这些值的列表/列的最快方法。

到目前为止,我可以为一个值执行此操作。例如

2*int(timeDF.iloc[0][11:13]) + int(int(timeDF.iloc[0][14:16])/30) 会将15:30:00转换为31

我想我可以通过循环来实现这一点,而不是使用0我使用循环遍历列长度的索引。但是有更快的方法吗?

一个热门编码

找到这些值后,我会使用一些单热编码器,我认为sklearn有一个。但最困难的部分是这个

愚蠢的解决方案

labels = []
for date in time:
    labels.append(2*int(date[11:13]) + int(int(date[14:16])/30))

这将包含值,然后可以执行here

之类的操作

2 个答案:

答案 0 :(得分:2)

我认为map需要get_dummies

首次2 2 2 需要0:000 - 0:30,所以使用1

range(48)
#convert to datetimes if necessary
df['time'] = pd.to_datetime(df['time'])

#create dictionary for map
a = dict(zip(pd.date_range('2010-01-01', '2010-01-01 23:59:39', freq='30T').time, range(48)))

#convert time column to times and map by dict
df['a'] = df['time'].dt.time.map(a)
print (df)
                  time   a
0  2017-03-01 15:30:00  31
1  2017-03-01 16:00:00  32
2  2017-03-01 16:30:00  33
3  2017-03-01 17:00:00  34
4  2017-03-01 17:30:00  35
5  2017-03-01 18:00:00  36
6  2017-03-01 18:30:00  37
7  2017-03-01 19:00:00  38
8  2017-03-01 19:30:00  39
9  2017-03-01 20:00:00  40
10 2017-03-01 20:30:00  41
11 2017-03-01 21:00:00  42
12 2017-03-01 21:30:00  43
13 2017-03-01 22:00:00  44

编辑:

#for one hot encoding use get_dummies
df1 = pd.get_dummies(df['time'].dt.time.map(a))
print (df1)
    31  32  33  34  35  36  37  38  39  40  41  42  43  44
0    1   0   0   0   0   0   0   0   0   0   0   0   0   0
1    0   1   0   0   0   0   0   0   0   0   0   0   0   0
2    0   0   1   0   0   0   0   0   0   0   0   0   0   0
3    0   0   0   1   0   0   0   0   0   0   0   0   0   0
4    0   0   0   0   1   0   0   0   0   0   0   0   0   0
5    0   0   0   0   0   1   0   0   0   0   0   0   0   0
6    0   0   0   0   0   0   1   0   0   0   0   0   0   0
7    0   0   0   0   0   0   0   1   0   0   0   0   0   0
8    0   0   0   0   0   0   0   0   1   0   0   0   0   0
9    0   0   0   0   0   0   0   0   0   1   0   0   0   0
10   0   0   0   0   0   0   0   0   0   0   1   0   0   0
11   0   0   0   0   0   0   0   0   0   0   0   1   0   0
12   0   0   0   0   0   0   0   0   0   0   0   0   1   0
13   0   0   0   0   0   0   0   0   0   0   0   0   0   1

答案 1 :(得分:2)

我认为这就是你要找的东西,即

x =pd.date_range("00:30", "23:30", freq="30min",format="%HH:%MM").astype(str).str[-8:]
maps = dict(zip(x,np.arange(1,48)))
df['new'] = df['time'].astype(str).str[-8:].map(maps)
pd.get_dummies(df['new']).set_index(df['time'])

输出:

                     31  32  33  34  35  36  37  38  39  40  41  42  43  44
time                                                                       
2017-03-01 15:30:00   1   0   0   0   0   0   0   0   0   0   0   0   0   0
2017-03-01 16:00:00   0   1   0   0   0   0   0   0   0   0   0   0   0   0
2017-03-01 16:30:00   0   0   1   0   0   0   0   0   0   0   0   0   0   0
2017-03-01 17:00:00   0   0   0   1   0   0   0   0   0   0   0   0   0   0
2017-03-01 17:30:00   0   0   0   0   1   0   0   0   0   0   0   0   0   0
2017-03-01 18:00:00   0   0   0   0   0   1   0   0   0   0   0   0   0   0
2017-03-01 18:30:00   0   0   0   0   0   0   1   0   0   0   0   0   0   0
2017-03-01 19:00:00   0   0   0   0   0   0   0   1   0   0   0   0   0   0
2017-03-01 19:30:00   0   0   0   0   0   0   0   0   1   0   0   0   0   0
2017-03-01 20:00:00   0   0   0   0   0   0   0   0   0   1   0   0   0   0
2017-03-01 20:30:00   0   0   0   0   0   0   0   0   0   0   1   0   0   0
2017-03-01 21:00:00   0   0   0   0   0   0   0   0   0   0   0   1   0   0
2017-03-01 21:30:00   0   0   0   0   0   0   0   0   0   0   0   0   1   0
2017-03-01 22:00:00   0   0   0   0   0   0   0   0   0   0   0   0   0   1