복붙노트

[PYTHON] 파이썬 numpy : datetime64 [ns]를 datetime64 [D] (Numba와 함께 사용)로 변환 할 수 없습니다.

PYTHON

파이썬 numpy : datetime64 [ns]를 datetime64 [D] (Numba와 함께 사용)로 변환 할 수 없습니다.

Numetime 함수에 datetime 배열을 전달하려고합니다 (벡터화 할 수없고 매우 느릴 수 있습니다). Numba는 numpy.datetime64를 지원합니다. 그러나 datetime64 [D] (day precision)는 지원하지만 datetime64 [ns] (millisecond precision)는 지원하지 않는 것 같습니다.

나는 datetime64 [ns]에서 datetime64 [D]로 변환하려고했지만, 길을 찾지 못했습니다! 어떤 아이디어?

나는 아래의 최소한의 코드로 내 문제를 요약했다. datetime64 [D] 인 testdf (mydates)를 실행하면 정상적으로 작동합니다. datetime64 [ns] 인 testdf (dates_input)를 실행하면 그렇지 않습니다. 이 예제는 날짜를 Numba 함수에 전달하기 만합니다. Numba 함수는 아무 것도하지 않습니다. dates_input을 datetime64 [D]로 변환하려고 시도하지만 변환이 작동하지 않습니다. 원래 코드에서 SQL 테이블을 판다 데이터 프레임으로 읽고 각 날짜의 날짜를 15 일로 변경하는 열이 필요합니다.

import numba
import numpy as np
import pandas as pd
import datetime

mydates =np.array(['2010-01-01','2011-01-02']).astype('datetime64[D]')
df=pd.DataFrame()
df["rawdate"]=mydates
df["month_15"] = df["rawdate"].apply(lambda r: datetime.date( r.year, r.month,15 ) )

dates_input = df["month_15"].astype('datetime64[D]')
print dates_input.dtype # Why datetime64[ns] and not datetime64[D] ??


@numba.jit(nopython=True)
def testf(dates):
    return 1

print testf(mydates)

testdf (dates_input)를 실행하면 오류가 발생합니다.

numba.typeinfer.TypingError: Failed at nopython (nopython frontend)
Var 'dates' unified to object: dates := {pyobject}

해결법

  1. ==============================

    1.Series.astype은 모든 날짜와 유사한 객체를 datetime64 [ns]로 변환합니다. datetime64 [D]로 변환하려면 값을 사용하여 astype을 호출하기 전에 NumPy 배열을 얻습니다.

    Series.astype은 모든 날짜와 유사한 객체를 datetime64 [ns]로 변환합니다. datetime64 [D]로 변환하려면 값을 사용하여 astype을 호출하기 전에 NumPy 배열을 얻습니다.

    dates_input = df["month_15"].values.astype('datetime64[D]')
    

    NDFrames (Series 및 DataFrames와 같은)는 datetime-like 객체를 dtype datetime64 [ns]의 객체로만 저장할 수 있습니다. 모든 datetime-likes를 공통 dtype으로 자동 변환하면 후속 날짜 계산이 간단 해집니다. 그러나 DataFrame 열에 datetime64 [s] 객체를 저장하는 것은 불가능합니다. 팬더 코어 개발자 Jeff Reback은 다음과 같이 설명합니다.

    또한 df [ 'month_15'] .astype ( 'datetime64 [D]')에는 dtype datetime64 [ns]가 있습니다.

    In [29]: df['month_15'].astype('datetime64[D]').dtype
    Out[29]: dtype('<M8[ns]')
    

    시리즈의 항목을 반복 할 때 datetime64 [ns]가 아닌 pandas Timestamp가 생성됩니다.

    In [28]: df['month_15'].astype('datetime64[D]').tolist()
    Out[28]: [Timestamp('2010-01-15 00:00:00'), Timestamp('2011-01-15 00:00:00')]
    

    그러므로 Numba가 실제로 datetime64 [ns]에 문제가 있음이 분명하지 않습니다. Timestamps에 문제가있을 수 있습니다. 죄송합니다. 확인할 수 없습니다. Numba가 설치되어 있지 않습니다.

    그러나 시도하는 것이 유용 할 수 있습니다.

    testf(df['month_15'].astype('datetime64[D]').values)
    

    df [ 'month_15'] .stat ( 'datetime64 [D]'). 값은 실제로 dtype datetime64 [ns]의 NumPy 배열입니다.

    In [31]: df['month_15'].astype('datetime64[D]').values.dtype
    Out[31]: dtype('<M8[ns]')
    

    그것이 작동하면, 모든 것을 datetime64 [D]로 변환 할 필요가 없으며, 판다 시리즈가 아닌 NumPy 배열을 testf로 전달하면됩니다.

  2. from https://stackoverflow.com/questions/31917964/python-numpy-cannot-convert-datetime64ns-to-datetime64d-to-use-with-numba by cc-by-sa and MIT license