Чтение csv с колонкой timestamp с pandas
При выполнении:
import pandas
x = pandas.read_csv('data.csv', parse_dates=True, index_col='DateTime',
names=['DateTime', 'X'], header=None, sep=';')
с этим data.csv
файлом:
1449054136.83;15.31
1449054137.43;16.19
1449054138.04;19.22
1449054138.65;15.12
1449054139.25;13.12
(1-й бит - это временная метка UNIX, то есть секунд, прошедших с 1/1/1970), я получаю эту ошибку при передискретизации данных каждые 15 секунд с помощью x.resample('15S')
:
TypeError: Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex
Это похоже на то, что информация "datetime" не была проанализирована:
X
DateTime
1.449054e+09 15.31
1.449054e+09 16.19
...
Как импортировать .CSV с датой, хранящейся как временную метку с модулем pandas?
Затем, как только я смогу импортировать CSV, , как получить доступ к строкам, для которых датa > 2015-12-02 12:02:18?
Ответы
Ответ 1
Мое решение было похоже на Майка:
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))
Ответ 2
Используйте to_datetime
и передайте unit='s'
для синтаксического анализа единиц как временных меток unix, это будет намного быстрее:
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)
Задержка
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
и
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
Таким образом, использование to_datetime
в этом маленьком наборе данных превышает 2x быстрее, я ожидаю, что это масштабируется намного лучше, чем другие методы
Ответ 3
Вы можете сами проанализировать дату:
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)
Результат:
>>> 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