您好我有一个数据框,其中包含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]
时。
答案 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]')
详细诀窍:我们已将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)