web-dev-qa-db-ja.com

timedelta64 [ns]列をPython =Pandas DataFrame

A pandas DataFrame column duration contains timedelta64[ns]示されているとおり。どのようにそれらを秒に変換できますか?

0   00:20:32
1   00:23:10
2   00:24:55
3   00:13:17
4   00:18:52
Name: duration, dtype: timedelta64[ns]

私は次を試しました

print df[:5]['duration'] / np.timedelta64(1, 's')

しかし、エラーが発生しました

Traceback (most recent call last):
  File "test.py", line 16, in <module>
    print df[0:5]['duration'] / np.timedelta64(1, 's')
  File "C:\Python27\lib\site-packages\pandas\core\series.py", line 130, in wrapper
    "addition and subtraction, but the operator [%s] was passed" % name)
TypeError: can only operate on a timedeltas for addition and subtraction, but the operator [__div__] was passed

また試した

print df[:5]['duration'].astype('timedelta64[s]')

しかし、エラーを受け取りました

Traceback (most recent call last):
  File "test.py", line 17, in <module>
    print df[:5]['duration'].astype('timedelta64[s]')
  File "C:\Python27\lib\site-packages\pandas\core\series.py", line 934, in astype
    values = com._astype_nansafe(self.values, dtype)
  File "C:\Python27\lib\site-packages\pandas\core\common.py", line 1653, in _astype_nansafe
    raise TypeError("cannot astype a timedelta from [%s] to [%s]" % (arr.dtype,dtype))
TypeError: cannot astype a timedelta from [timedelta64[ns]] to [timedelta64[s]]
34
Nyxynyx

これは、Pandas(バージョン0.14)の現在のバージョンで正常に機能します。

In [132]: df[:5]['duration'] / np.timedelta64(1, 's')
Out[132]: 
0    1232
1    1390
2    1495
3     797
4    1132
Name: duration, dtype: float64

古いバージョンのPandas/NumPyの回避策は次のとおりです。

In [131]: df[:5]['duration'].values.view('<i8')/10**9
Out[131]: array([1232, 1390, 1495,  797, 1132], dtype=int64)

timedelta64およびdatetime64データは、8バイトint(dtype '<i8')。したがって、上記では、timedelta64sを8バイト整数と見なし、整数の除算を行ってナノ秒を秒に変換します。

NumPyバージョン1.7以降が必要 datetime64/timedelta64sで動作することに注意してください。

47
unutbu

Series dt accessor を使用して、日時(timedelta)シリーズのメソッドと属性にアクセスします。

>>> s
0   -1 days +23:45:14.304000
1   -1 days +23:46:57.132000
2   -1 days +23:49:25.913000
3   -1 days +23:59:48.913000
4            00:00:00.820000
dtype: timedelta64[ns]
>>>
>>> s.dt.total_seconds()
0   -885.696
1   -782.868
2   -634.087
3    -11.087
4      0.820
dtype: float64

Datetimelikeプロパティ

15
wwii

私のような放浪者が検索エンジンの上位5件の結果のみをクリックして、ここにたどり着くと、とにかく古いスレッドだと気づきました。

タイプが正しいことを確認してください。

  • datetimesecondsに変換する場合、1つの日付内の期間の場合、datetimeオブジェクトの時間、分、秒ごとに秒を合計するだけです。

      • 時間-時間x 3600 =秒
      • 分-分x 60 =秒
      • 秒-秒

_linear_df['duration'].dt.hour*3600 + linear_df['duration'].dt.minute*60 + linear_df['duration'].dt.second_

  • timedeltasecondsに変換する場合は、次のいずれかを使用します。

linear_df[:5]['duration'].astype('timedelta64[s]')

私はこのように動作するようにしました:

start_dtおよびend_dt列は次の形式です。

_import datetime

linear_df[:5]['start_dt']

0   1970-02-22 21:32:48.000
1   2016-12-30 17:47:33.216
2   2016-12-31 09:33:27.931
3   2016-12-31 09:52:53.486
4   2016-12-31 10:29:44.611
Name: start_dt, dtype: datetime64[ns]
_

startおよびend datetime値の減算であるtimedelta64 [ns]形式で期間がありました。

_linear_df['duration'] = linear_df['end_dt'] - linear_df['start_dt']
_

結果の期間列は次のようになります

_linear_df[:5]['duration']

0          0 days 00:00:14
1   2 days 17:44:50.558000
2   0 days 15:37:28.418000
3   0 days 18:45:45.727000
4   0 days 19:21:27.159000
Name: duration, dtype: timedelta64[ns]
_

pandasを使用すると、2つの日付の間の期間を浮動小数点数で指定しました。その後、期間を比較またはフィルタリングするのが簡単になりました。

_linear_df[:5]['duration'].astype('timedelta64[s]')

0        14.0
1    236690.0
2     56248.0
3     67545.0
4     69687.0
Name: duration, dtype: float64
_

私の場合、1秒を超えるすべての期間を取得したい場合。

それが役に立てば幸い。

11
Gunay Anach

pandas apply()関数を使用するだけです

def get_seconds(time_delta):
    return time_delta.seconds

def get_microseconds(time_delta):
    return time_delta.micro_seconds

time_delta_series = df['duration']

converted_series = time_delta_series.apply(get_seconds)
print(converted_series)
2
Pardhu