Ненусификация вектора, как я могу преобразовать из dtype = 'timedelta64 [us]' в целое число (дни) [дублировать]

Я прошел через это, но мне нужны были правила, которые должны быть записаны в этом формате

if A>0.4 then if B<0.2 then if C>0.8 then class='X' 

. Поэтому я адаптировал ответ @paulkernfeld (спасибо), который вы можете настроить в соответствии с вашими потребностями

def tree_to_code(tree, feature_names, Y):
    tree_ = tree.tree_
    feature_name = [
        feature_names[i] if i != _tree.TREE_UNDEFINED else "undefined!"
        for i in tree_.feature
    ]
    pathto=dict()

    global k
    k = 0
    def recurse(node, depth, parent):
        global k
        indent = "  " * depth

        if tree_.feature[node] != _tree.TREE_UNDEFINED:
            name = feature_name[node]
            threshold = tree_.threshold[node]
            s= "{} <= {} ".format( name, threshold, node )
            if node == 0:
                pathto[node]=s
            else:
                pathto[node]=pathto[parent]+' & ' +s

            recurse(tree_.children_left[node], depth + 1, node)
            s="{} > {}".format( name, threshold)
            if node == 0:
                pathto[node]=s
            else:
                pathto[node]=pathto[parent]+' & ' +s
            recurse(tree_.children_right[node], depth + 1, node)
        else:
            k=k+1
            print(k,')',pathto[parent], tree_.value[node])
    recurse(0, 1, 0)
53
задан vonPetrushev 30 November 2015 в 19:47
поделиться

3 ответа

Вы можете преобразовать его в timedelta с точностью до дня. Чтобы извлечь целочисленное значение дней, вы разделите его на timedelta одного дня.

>>> x = np.timedelta64(2069211000000000, 'ns')
>>> days = x.astype('timedelta64[D]')
>>> days / np.timedelta64(1, 'D')
23

Или, как предположил @PhillipCloud, просто days.astype(int), поскольку timedelta - всего лишь 64-битное целое число, которое ('D', 'ns', ...).

Вы можете найти больше об этом здесь .

g3]

89
ответ дан Viktor Kerkez 24 August 2018 в 04:24
поделиться

Предположим, у вас есть серия timedelta:

import pandas as pd
from datetime import datetime
z = pd.DataFrame({'a':[datetime.strptime('20150101', '%Y%m%d')],'b':[datetime.strptime('20140601', '%Y%m%d')]})

td_series = (z['a'] - z['b'])

. Один из способов конвертировать этот timedelta-столбец или серию - это передать его объекту Timedelta (pandas 0.15.0+), а затем извлечь дни из объект:

td_series.astype(pd.Timedelta).apply(lambda l: l.days)

Другой способ состоит в том, чтобы вывести серию как timedelta64 в днях, а затем передать ее как int:

td_series.astype('timedelta64[D]').astype(int)
6
ответ дан mgoldwasser 24 August 2018 в 04:24
поделиться

Используйте dt.days , чтобы получить атрибут days как целые числа.

Например:

In [14]: s = pd.Series(pd.timedelta_range(start='1 days', end='12 days', freq='3000T'))

In [15]: s
Out[15]: 
0    1 days 00:00:00
1    3 days 02:00:00
2    5 days 04:00:00
3    7 days 06:00:00
4    9 days 08:00:00
5   11 days 10:00:00
dtype: timedelta64[ns]

In [16]: s.dt.days
Out[16]: 
0     1
1     3
2     5
3     7
4     9
5    11
dtype: int64

В более общем плане - вы можете использовать кнопку .components для доступа к уменьшенной форме timedelta.

In [17]: s.dt.components
Out[17]: 
   days  hours  minutes  seconds  milliseconds  microseconds  nanoseconds
0     1      0        0        0             0             0            0
1     3      2        0        0             0             0            0
2     5      4        0        0             0             0            0
3     7      6        0        0             0             0            0
4     9      8        0        0             0             0            0
5    11     10        0        0             0             0            0

Теперь, чтобы получить атрибут hours:

In [23]: s.dt.components.hours
Out[23]: 
0     0
1     2
2     4
3     6
4     8
5    10
Name: hours, dtype: int64
19
ответ дан Nickil Maveli 24 August 2018 в 04:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: