numpy.timedelta64値から日を抽出する


87

私はpandas / pythonを使用しており、日付/時刻を含むdfのフィールドで「to_datetime」関数を使用して生成された2つの日付時系列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

シリーズの1つの要素をどのように見るか:

s3 [10]

私はこのようなものを手に入れます:

numpy.timedelta64(2069211000000000、 'ns')

s3から日を抽出し、整数として保持するにはどうすればよいですか(時間/分などにはあまり関心がありません)。

助けてくれてありがとう。


4
参考までに、パンダにマージしようとすると、この機能がマスターされます:github.com/pydata/pandas/pull/4534(0.12以前にこれを行うことができます:s.apply(lambda x: x / np.timedelta64(1,'D'))
Jeff

回答:


147

日精度でタイムデルタに変換できます。日の整数値を抽出するには、それを1日のタイムデルタで除算します。

>>> 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)
フィリップクラウド

1
パンダの最新バージョンは、本格的な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行の場合(約24s)よりもはるかに効率的です。
Pengju Zhao 2017

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-この質問が行われてからパンダパッケージが進行しているため、これは現在これを行うための最良の方法です。
オースティン

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列またはシリーズを変換する1つの方法は、Timedeltaオブジェクト(パンダ0.15.0+)にキャストしてから、オブジェクトから日を抽出することです。

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

もう1つの方法は、シリーズをtimedelta64として日数でキャストしてから、intとしてキャストすることです。

td_series.astype('timedelta64[D]').astype(int)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.