numpy.timedelta64 값에서 일 추출


87

pandas / python을 사용하고 있으며 날짜 / 시간을 포함하는 df의 필드에 'to_datetime'함수를 사용하여 생성 된 두 개의 날짜 시계열 s1 및 s2가 있습니다.

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

시리즈의 한 요소를 어떻게 봅니까?

s3 [10]

나는 다음과 같은 것을 얻는다.

numpy.timedelta64 (2069211000000000, 'ns')

s3에서 날짜를 추출하고 정수로 유지하는 방법 (시간 / 분 등에 관심이 없음)?

도움을 주셔서 미리 감사드립니다.


4
참고로 pandas에 병합 하려고 합니다.이 기능을 마스터하십시오. github.com/pydata/pandas/pull/4534(0.12 이전에 다음 작업을 수행 할 수 있습니다.s.apply(lambda x: x / np.timedelta64(1,'D'))
Jeff

답변:


147

일 정밀도를 사용하여 타임 델타로 변환 할 수 있습니다. 일의 정수 값을 추출하려면 1 일의 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', ...).

여기에서 자세한 내용을 확인할 수 있습니다 .


16
days.item().days또는 을 수행 할 수도 있습니다 days.astype(int).
Phillip Cloud

1
최신 버전의 pandas는 완전한 Timedelta 유형을 지원합니다. 여기에서 문서를 참조하십시오. pandas.pydata.org/pandas-docs/stable/timedeltas.html
Jeff

.apply에 적합한 후보입니다. 열 수준에서 변환을 적용하기 위해 끝에 .apply (lambda x : x / np.timedelta64 (1, 'D'))를 넣어 열 값을 계산하는 동일한 줄에서이 작업을 수행 할 수 있습니다. 예 : s3 = (s1-s2) .apply (lambda x : x / np.timedelta64 (1, 'D')).
Ezekiel Kruglick 2015

2
이 방법 astype('timedelta64[D]')(약 96ms)은 dt.days.4,000,000 행의 경우 (약 24 초) 보다 훨씬 효율적 입니다.
Pengju Zhao

39

dt.daysdays 속성을 정수로 가져 오는 데 사용 합니다.

예 :

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

+1-이 질문을받은 이후 pandas 패키지가 진행되었으므로 현재이 작업을 수행하는 가장 좋은 방법입니다.
Austin A

7

타임 델타 시리즈가 있다고 가정합니다.

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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.