2015-09-19 3 views
1

Я ввезенные следующие данные в файл CSV:Преобразование объекта панды в нескольких столбцов

  • 01/01/2014 00:00:00, 50,031
  • 01/01/2014 00:00: 01, 50,026
  • 01/01/2014 00:00:02, 50,019
  • 01/01/2014 00:00:03, 50,008
  • и т.д.

I succe ssfully превратили «объект» в первой колонке Задан с помощью:

df= pd.read_csv("myfile.csv",names=['DateTime','Freq']) 
df['DateTime'] = pd.to_datetime(df['DateTime'], coerce=True) 

Проблема заключается в том, что это очень большой файл CSV (35 миллионов строк), и это собака медленно. Есть ли более эффективные способы преобразования первого столбца в datetime?

Я также хотел бы разделить дату и время на отдельные столбцы.

+1

Вы можете передать из параметров 'parse_dates = [0]' 'для read_csv' так попробовать' ДФ = pd.read_csv ("myfile.csv", имена = ['DateTime', 'Freq'], parse_dates = [0]) 'this будет анализировать первый столбец как дату и время, оно должно быть значительно быстрее – EdChum

+0

Спасибо. Кажется, это работает, но не очень большая скорость. –

ответ

1

Да, вы можете сделать это в самой функции read_csv(), вы можете использовать аргумент parse_dates и отправить в список столбцов для анализа в качестве даты для него. Пример -

df= pd.read_csv("myfile.csv",names=['DateTime','Freq'],parse_dates=['DateTime']) 

Демо -

In [41]: import io 

In [42]: s = """Date, SomeNum 
    ....: 01/01/2014 00:00:00, 50.031 
    ....: 01/01/2014 00:00:01, 50.026 
    ....: 01/01/2014 00:00:02, 50.019 
    ....: 01/01/2014 00:00:03, 50.008""" 

In [43]: df = pd.read_csv(io.StringIO(s),parse_dates=['Date']) 

In [44]: df 
Out[44]: 
       Date SomeNum 
0 2014-01-01 00:00:00 50.031 
1 2014-01-01 00:00:01 50.026 
2 2014-01-01 00:00:02 50.019 
3 2014-01-01 00:00:03 50.008 

In [45]: df['Date'] 
Out[45]: 
0 2014-01-01 00:00:00 
1 2014-01-01 00:00:01 
2 2014-01-01 00:00:02 
3 2014-01-01 00:00:03 
Name: Date, dtype: datetime64[ns] 

результаты синхронизации различных методов для CSV с 1 миллиона записей -

In [92]: def func1(): 
    ....:  df = pd.read_csv('a.csv',names=['DateTime','Freq']) 
    ....:  df['DateTime'] = pd.to_datetime(df['DateTime'], coerce=True,format='%d/%m/%Y %H:%M:%S') 
    ....:  return df 
    ....: 

In [96]: def func2(): 
    ....:  return pd.read_csv('a.csv',names=['DateTime','Freq'],parse_dates=['DateTime']) 
    ....: 

In [97]: %timeit func1() 
1 loops, best of 3: 6.5 s per loop 

In [98]: %timeit func2() 
1 loops, best of 3: 652 ms per loop 
+1

Спасибо за это. Это сработало, но, похоже, прошло больше времени, чем мои первоначальные усилия. –

+0

Хммм, я бы подумал попробовать сделать это сам 'read_csv()', будет быстрее. Время проведения некоторых тестов времени с большими наборами данных. –

+2

@AnthonyW: И это решение, и ваше оригинальное решение можно сделать намного быстрее, если вы укажете формат даты (используйте параметр 'format'). На данный момент панды должны вывести формат даты и времени - это сравнительно дорого сравнивается. –

0

read_csv принимает parse_dates в качестве аргумента. Передайте ему список столбцов даты в файле csv. Для разделения времени от разобранного DateTime колонки, попробуйте:

df['Date'] = df.DateTime.apply(lambda d: str(d.date()) 
df['Time'] = df.DateTime.apply(lambda d: str(d.time()) 
+0

Мне казалось, что это не работает, но это работает нормально: 'df ['date'] = df ['DateTime']. Применить (lambda x: x.strftime ('% d% m % Y ')) ' ' df [' time '] = df [' DateTime ']. Apply (lambda x: x.strftime ('% H% M% S ')) ' –

Смежные вопросы