绘制两个datetime64 [ns]之间的差异

时间:2014-11-29 10:11:00

标签: python numpy pandas

您好我有一个数据框,其中包含2列datetime64[ns]类型的列。我清理数据以删除null(NaT)值(删除两列中出现null的行)和从另一列中减去一列以获得差异。

用分钟箱和10分钟箱子绘制这些数据直方图的最佳方法是什么?

我已尝试numpy.histrogram(返回错误:TypeError: ufunc add cannot use operands with types dtype('<m8[ns]') and dtype('float64'))和hist(series)(返回错误:KeyError: 0)。

当我series.dtype返回<m8[ns]时。

2 个答案:

答案 0 :(得分:3)

让我们生成一些数据:

import numpy as np
d1 = np.arange(np.datetime64('2014-11-01 12:00'), np.datetime64('2014-11-01 14:00'))
d2 = d1.copy()
np.random.shuffle(d2)
diff = d2 - d1

差异的类型现在 - 正如你所发现的 - 时间极限。这是它的会议记录:

>>> diff.dtype
dtype('<m8[m]')

但是我们需要浮点数或整数,所以投射我们的数据:

>>> plt.hist(diff.astype(np.int32))
(array([  3.,   9.,  11.,  17.,  17.,  27.,  10.,  12.,  11.,   3.]), array([-115. ,  -92.2,  -69.4,  -46.6,  -23.8,   -1. ,   21.8,   44.6,
         67.4,   90.2,  113. ]), <a list of 10 Patch objects>)
>>> plt.ylabel('time difference [m]')

enter image description here

详细诀窍:我们已将timedeltas转换为整数(也可能是浮点数,但我们在这里不需要它们。)

>>> diff.astype(np.int32)
array([  78,   47,   55,   25,   22,   58,  113,    0,   -3,    7,   95,
        104,   10,   69,   16,   34,   87,   -2,   83,   16,   77,   48,
         10,   30,   52,   31,   47,   54,   83,  -21,   16,   76,   85,
         58,   68,   12,   74,    1,   68,   21,  -15,  -27,   -6,    1,
         -3,   43,  -34,   32,   46,  -22,    5,  -48,   16,  -33,   55,
        -37,  -25,  -53,  -21,  -48,   54,  -51,  -33,   20,  -12,   48,
         14,  -34,    6,   -2,  -36,    6,   20,  -67,  -55,   43,   32,
        -12,   11,   16,    5,  -31,   34,   21,  -20,   11,  -77,  -26,
        -18,    1,  -18,  -68,    6,   19,  -92,   -9,   -9,  -26,  -40,
        -98,  -34,   -1,  -43,  -82,  -65,  -88,  -52,  -32,  -84,  -58,
        -97,  -49,  -13,  -73,  -71, -115,  -71,  -24,  -76,  -35], dtype=int32)

或者如果你需要它们在几秒钟内,首先将它们转换为秒,然后转换为整数:

>>> diff.astype('m8[s]').astype(np.int32)
array([ 4680,  2820,  3300,  1500,  1320,  3480,  6780,     0,  -180,
         420,  5700,  6240,   600,  4140,   960,  2040,  5220,  -120,
        4980,   960,  4620,  2880,   600,  1800,  3120,  1860,  2820,
        3240,  4980, -1260,   960,  4560,  5100,  3480,  4080,   720,
        4440,    60,  4080,  1260,  -900, -1620,  -360,    60,  -180,
        2580, -2040,  1920,  2760, -1320,   300, -2880,   960, -1980,
        3300, -2220, -1500, -3180, -1260, -2880,  3240, -3060, -1980,
        1200,  -720,  2880,   840, -2040,   360,  -120, -2160,   360,
        1200, -4020, -3300,  2580,  1920,  -720,   660,   960,   300,
       -1860,  2040,  1260, -1200,   660, -4620, -1560, -1080,    60,
       -1080, -4080,   360,  1140, -5520,  -540,  -540, -1560, -2400,
       -5880, -2040,   -60, -2580, -4920, -3900, -5280, -3120, -1920,
       -5040, -3480, -5820, -2940,  -780, -4380, -4260, -6900, -4260,
       -1440, -4560, -2100], dtype=int32)

根据数据的精确度,可能需要转换为浮点而不是整数:

diff.astype('m8[s]').astype(np.float32)

答案 1 :(得分:0)

这可能是过期的,但它可以帮助某人。我想实现同样的事情,并做了一个演员,但有一个错误。实现了我的timedelta在[ns]。所以我不得不首先投射到[s],然后它可以投入浮动。

time_delta.astype('m8[s]').astype(np.float32)