Hvordan kan jeg lave en python-numpy arange datetime

Jeg har nogle input data, med timestamps i input-filen i form af timer fra den dato, tidspunkt, der er angivet i filnavnet.

Dette er en lidt ubrugelig, så jeg har brug for at konvertere det til python datetime.datetime objekter, og derefter sætte den i en numpy array. Jeg kunne skrive en for-løkke, men jeg vil gerne gøre noget lignende:

numpy.arange(datetime.datetime(2000, 1,1), datetime.datetime(2000, 1,2), datetime.timedelta(hours=1))

der kaster en TypeError.

Kan det gøres? Jeg sidder med python 2.6 og numpy 1.6.1.

OriginalForfatteren Melanie | 2012-08-27

5 svar

  1. 12

    Se NumPy Datetimes og Timedeltas. Dybest set, kan du repræsenterer datetimes i NumPy hjælp numpy.datetime64 type, som tillader dig at gøre intervaller af værdier.

    For NumPy 1.6, som har en meget mindre nyttigt datetime64 type, kan du bruge en passende liste forståelse for at bygge datetimes (se også At skabe en række datoer i Python):

    base = datetime.datetime(2000, 1, 1)
    arr = numpy.array([base + datetime.timedelta(hours=i) for i in xrange(24)])

    Dette giver

    array([2000-01-01 00:00:00, 2000-01-01 01:00:00, 2000-01-01 02:00:00,
       2000-01-01 03:00:00, 2000-01-01 04:00:00, 2000-01-01 05:00:00,
       2000-01-01 06:00:00, 2000-01-01 07:00:00, 2000-01-01 08:00:00,
       2000-01-01 09:00:00, 2000-01-01 10:00:00, 2000-01-01 11:00:00,
       2000-01-01 12:00:00, 2000-01-01 13:00:00, 2000-01-01 14:00:00,
       2000-01-01 15:00:00, 2000-01-01 16:00:00, 2000-01-01 17:00:00,
       2000-01-01 18:00:00, 2000-01-01 19:00:00, 2000-01-01 20:00:00,
       2000-01-01 21:00:00, 2000-01-01 22:00:00, 2000-01-01 23:00:00], dtype=object)
    Hvis bare jeg havde numpy 1.7, ville dette være svaret. Men det synes jeg har 1.6.1, så det eksempel, der ikke virker.
    Tilføjet en metode, der arbejder med 1.6.
    Og er også kompatibel med datetime jeg har brug for til produktionen. Tak!
    dette er ikke en vektoriseret løsning, så der kan være langsom

    OriginalForfatteren nneonneo

  2. 19
    from datetime import datetime, timedelta
    
    t = np.arange(datetime(1985,7,1), datetime(2015,7,1), timedelta(days=1)).astype(datetime)

    Det centrale punkt er her at bruge astype(datetime), ellers vil resultatet blive datetime64.

    TypeError: ‘modul’ objekt er ikke konverterbar. Nogen idé? hvad der skal importeres først?

    OriginalForfatteren Arc Shinus

  3. 10

    Med moderne NumPy du kan gøre dette:

    np.arange(np.datetime64('2017-01-01'), np.datetime64('2017-01-08'))

    Og det giver dig:

    array(['2017-01-01', '2017-01-02', '2017-01-03', '2017-01-04',
           '2017-01-05', '2017-01-06', '2017-01-07'], dtype='datetime64[D]')
    Kan jeg sætte skridt her? kan lide: en uge, 10 dage, en måned eller et år?
    Sikker. Brug np.timedelta64(...).

    OriginalForfatteren John Zwinck

  4. 7

    Bemærk, at @nneonneo løsning kan være forenklet i

    result = first_date + np.arange(24) * datetime.timedelta(hours=1)

    tak til NumPy array manipulationer. Den result array har derefter en dtype=object.

    For mere komplekse områder, kan du måske være interesseret i scikits.timeseries pakke (som ikke længere vedligeholdes) eller bedre,
    pandaerne pakke, der reimplemented de fleste af de ideer,scikits.timeseries. Begge pakker til at understøtte ældre versioner af NumPy (1.5, 1.6…)

    Tak – det ser ud som om, at jeg skulle have været brugt pandaer for hele opgaven. Næste gang 🙂

    OriginalForfatteren Pierre GM

  5. 6

    Som nævnt i et andet svar, for Numpy > 1.7, kan du bruge Numpy er indbygget i datetime kapacitet. Eksemplerne i Numpy documentation omfatter ikke hjælp np.arange med trin, så her er en:

    timearray = np.arange('2000-01-01', '2000-01-02',np.timedelta64(1,'h'), dtype='datetime64')

    Numpy sætter dtype af dette resultat til datetime64[h]. Du kan indstille dette udtrykkeligt, at nogle mindre enhed af tid med dtype='datetime64[m]'.

    I version 1.8.1 (og jeg forventer, at tidligere), der forsøger at tilføje et offset til at følge array, som er mindre end en time, vil have nogen effekt.

    • timearray += np.timedelta64(10,'s') ikke ændre timearray
    • timearray2 = timearray + np.timedelta64(10,'s') vil tilføje 10 sekunder at timearray og konverterer dtype af timearray2 at datetime64[s]

    OriginalForfatteren Thav

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *