Lecture d'un csv avec une colonne timestamp, avec des pandas

Quand on fait:

import pandas
x = pandas.read_csv('data.csv', parse_dates=True, index_col='DateTime', 
                                names=['DateTime', 'X'], header=None, sep=';')

avec cette data.csv fichier:

1449054136.83;15.31
1449054137.43;16.19
1449054138.04;19.22
1449054138.65;15.12
1449054139.25;13.12

(le 1er colum est un timestamp UNIX, i.e. secondes écoulées depuis le 1/1/1970), je reçois cette erreur en rééchantillonnant les données toutes les 15 secondes avec x.resample('15S'):

TypeError: Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex

c'est comme si l'information "datetime" n'avait pas été analysée:

                 X
DateTime      
1.449054e+09  15.31                
1.449054e+09  16.19
...

comment importer un .CSV avec date stockée comme horodatage avec le module pandas?

Puis une fois que je serai en mesure de importer le fichier CSV, comment accéder aux lignes à quelle date > 2015-12-02 12:02: 18?

17
demandé sur Basj 2015-12-06 23:34:14

3 réponses

ma solution était similaire à celle de Mike:

import pandas
import datetime
def dateparse (time_in_secs):    
    return datetime.datetime.fromtimestamp(float(time_in_secs))

x = pandas.read_csv('data.csv',delimiter=';', parse_dates=True,date_parser=dateparse, index_col='DateTime', names=['DateTime', 'X'], header=None)

out = x.truncate(before=datetime.datetime(2015,12,2,12,2,18))
17
répondu Budo Zindovic 2015-12-06 23:44:17

Utiliser to_datetime et passer unit='s' pour analyser les unités comme des timestamps unix, ce sera beaucoup plus rapide:

In [7]:
pd.to_datetime(df.index, unit='s')

Out[7]:
DatetimeIndex(['2015-12-02 11:02:16.830000', '2015-12-02 11:02:17.430000',
               '2015-12-02 11:02:18.040000', '2015-12-02 11:02:18.650000',
               '2015-12-02 11:02:19.250000'],
              dtype='datetime64[ns]', name=0, freq=None)

Timings:

In [9]:

import time
%%timeit
import time
def date_parser(string_list):
    return [time.ctime(float(x)) for x in string_list]
​
df = pd.read_csv(io.StringIO(t), parse_dates=[0],  sep=';', 
                 date_parser=date_parser, 
                 index_col='DateTime', 
                 names=['DateTime', 'X'], header=None)
100 loops, best of 3: 4.07 ms per loop

et

In [12]:
%%timeit
t="""1449054136.83;15.31
1449054137.43;16.19
1449054138.04;19.22
1449054138.65;15.12
1449054139.25;13.12"""
df = pd.read_csv(io.StringIO(t), header=None, sep=';', index_col=[0])
df.index = pd.to_datetime(df.index, unit='s')
100 loops, best of 3: 1.69 ms per loop

donc en utilisant to_datetime est plus de 2X plus rapide sur ce petit ensemble de données, je m'attends à ce que cette échelle beaucoup mieux que les autres méthodes

15
répondu EdChum 2015-12-06 21:01:31

Vous pouvez analyser la date vous-même:

import time
import pandas as pd

def date_parser(string_list):
    return [time.ctime(float(x)) for x in string_list]

df = pd.read_csv('data.csv', parse_dates=[0],  sep=';', 
                 date_parser=date_parser, 
                 index_col='DateTime', 
                 names=['DateTime', 'X'], header=None)

Le résultat:

>>> df
                        X
DateTime                  
2015-12-02 12:02:16  15.31
2015-12-02 12:02:17  16.19
2015-12-02 12:02:18  19.22
2015-12-02 12:02:18  15.12
2015-12-02 12:02:19  13.12
2
répondu Mike Müller 2015-12-06 20:50:38