如何创建二进制列timedelta和bin列表

时间:2015-08-11 18:46:49

标签: python list date binary

我希望从列表和timedelta创建二进制列。以下是我到目前为止的情况:

weather_list = ['5', '15', '30', '40'}
for i in weather_list:
    col = 'r_' + i
    epi.data[col] = np.where((help.data['help_beg_date'] + timedelta(float(i) -
                                                                 1)) >= help.data['HL_DATE'], 1, 0)

但是,此输出是累积的。例如;如果观察是距离help_beg_dt的16天,它会将列r_5r_15r_30中的值作为0,1,1,1返回。我需要输出列值为0,1,0,0。1值低于r_30但超过r_15。

我正在考虑创建另一个列表来获得下一个i序列;所以我可以使用更大和更小的表达。我假设您可以只使用一个列表来执行此操作。

1 个答案:

答案 0 :(得分:0)

在我看来,您的问题是对“binning'基于窗口列表的列。这通常由pd.cut实现。对你来说,你正在装箱的系列是

datediff = help.data['HL_DATE'] - help.data['help_beg_date']

并且您希望根据天气列表将其分类。首先,我们需要将这些时间转换为天;这是通过系列的dt.days方法加入的(dt是datetime的缩写)。然后我们可以使用pd.cut来构建这样的箱子(注意我已经在天气列表中添加了0,以制作有效的窗口):

weather_list = [0, 5, 15, 30, 40]
bins = pd.cut(datediff.dt.days, weather_list)
bins
0      (0, 5]
1     (5, 15]
2    (15, 30]
3    (15, 30]
dtype: category
Categories (4, object): [(0, 5] < (5, 15] < (15, 30] < (30, 40]]

最后,可以使用pd.get_dummies

将其转换为指标列
indicators = pd.get_dummies(bins)
indicators

   (0, 5]  (5, 15]  (15, 30]  (30, 40]
0       1        0         0         0
1       0        1         0         0
2       0        0         1         0
3       0        0         1         0

您可以使用

将这些添加到数据框中
pd.concat([epi.data,indicators],axis = 1)