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
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
以作为整数获取属性。 例如:
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)
## 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'在情况下您的解决方案速度很重要:
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)