从numpy.timedelta64 value

问题描述 投票:0回答:5
减s1时

I正在使用pandas/python和我有两个日期时间序列S1和S2,它们是在包含日期/times的DF字段上使用“ to_dateTime”函数生成的。

当我从s2

减去S1时

S3= S2 -S1

我得到一个类型的S3系列

timedelta64 [ns]

0 385 days, 04:10:36 1 57 days, 22:54:00 2 642 days, 21:15:23 3 615 days, 00:55:44 4 160 days, 22:13:35 5 196 days, 23:06:49 6 23 days, 22:57:17 7 2 days, 22:17:31 8 622 days, 01:29:25 9 79 days, 20:15:14 10 23 days, 22:46:51 11 268 days, 19:23:04 12 NaT 13 NaT 14 583 days, 03:40:39
我如何看该系列的1个元素:

S3[10]

我得到这样的东西:

numpy.timedelta64(2069211000000000,'ns')

我如何从S3中提取几天,也许将它们保留为整数(对小时/分钟不太感兴趣)?

您可以以一天的精度将其转换为时间码。为了提取一天的时间序列的整数,以一天的时间划分。

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

正如@phillipcloud所建议的那样,
python numpy pandas
5个回答
196
投票
只是

timedelta

,因为
'D'
只是一个64位整数,根据您传递的第二个参数(

'ns'

dt.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

以作为整数获取属性。 例如:


70
投票

通常 - 您可以使用

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

    
platsose you tour 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'])

转换此序列列或系列的一种方法是将其施放为序列室对象(pandas 0.15.0+),然后从对象中提取天数:

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

其他方法是在几天内将该系列作为序列级64,然后将其施加为INT:

td_series.astype('timedelta64[D]').astype(int)

10
投票
首先,通过使用以下方式将熊猫日期时间转换为日期时间列:

## Convert time in pandas date time df['Start'] = pd.to_datetime(df['Start'], errors='coerce')
完成完成的使用以下命令减去两个日期:

df["Duration_after subtraction"] = (df['End_Time'] - df['Start_Time'] / np.timedelta64(1, 'm')
要转换为小时使用“ H”而不是'M'

在情况下您的解决方案速度很重要:

0
投票
(NS一天:

86400000000000 = 1e9 * 60 * 60 * 24

delta = np.timedelta64(469756800000000000,'ns')

# 6 equivalent solutions
%timeit int(delta) // 86400000000000
%timeit int(delta // 86400000000000)
%timeit (delta // 86400000000000).astype(int)
%timeit delta.astype('timedelta64[D]').item().days
%timeit delta.astype('timedelta64[D]').astype(int)
%timeit delta.astype('timedelta64[D]') // np.timedelta64(1, 'D')

第一个解决方案(
int(delta) // 86400000000000
)最快的速度约为4倍:

231 ns ± 4.44 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each) 1.18 μs ± 6.59 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each) 1.72 μs ± 5.36 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each) 961 ns ± 3.5 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each) 1.3 μs ± 14.2 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each) 1.8 μs ± 4.47 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)

0
投票
解决方案虽然不可读取,因此建议将其包裹在功能中,或者如果速度不关心的话,请选择使用更可读的解决方案。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.