2016-03-18 3 views
2

Мне нужно получить данные с 2014 года и 2015 года. Как я могу это сделать, если у меня есть файл со строками типа (есть 499 тысяч)Группа csv string по году

4be390eefaf9a64e7cb52937c4a5c77a,"e1.ru",2014-09-30 18:14:58,57,4 
4be390eefaf9a64e7cb52937c4a5c77a,"e1.ru",2014-09-30 20:11:15,1884,90 
4be390eefaf9a64e7cb52937c4a5c77a,"e1.ru",2014-10-04 09:44:21,1146,6 
4be390eefaf9a64e7cb52937c4a5c77a,"avito.ru",2014-09-29 21:01:29,48,3 

Я попытался преобразовать формат даты d = datetime.strptime('used_at', "%Y-%m-%d %H:%M:%S"), но у меня есть об ошибках: данные о времени «used_at» не соответствует формату '% Y-% m-% d% H:% M:% S'.

И я попытался df.groupby(df['date_col'].dt.year) но есть ошибка может использовать только .dt аксессор с datetimelike значениями я прочитал Csv infile = pd.read_csv("avito_trend.csv")

+0

Вы можете просто разобрать, что в качестве даты и времени с помощью '' read_csv' так read_csv (file_path, parse_dates = [2]) ', то вы можете сделать' df.groupby (df ['date_col']. dt.year) ' – EdChum

+0

Это не работает. У меня есть ошибка: можно использовать только .dt accessor с datetimelike значениями – ldevyataykina

+0

Можете ли вы отредактировать свой пост с более подробными данными и кодом, который вызывает эту ошибку, спасибо – EdChum

ответ

1

Вы можете выбрать строки с многолетним 2014 и 2015 по dt.year и isin:

import pandas as pd 
import io 

temp=u"""4be390eefaf9a64e7cb52937c4a5c77a,"e1.ru",2013-09-30 18:14:58,57,4 
4be390eefaf9a64e7cb52937c4a5c77a,"e1.ru",2014-09-30 20:11:15,1884,90 
4be390eefaf9a64e7cb52937c4a5c77a,"e1.ru",2015-10-04 09:44:21,1146,6 
4be390eefaf9a64e7cb52937c4a5c77a,"avito.ru",2016-09-29 21:01:29,48,3""" 

df = pd.read_csv(io.StringIO(temp), #after testing replace io.StringIO(temp) to filename 
       header=None, #no header 
       parse_dates=[2], #parse 3rd column to datetime 
       names=['a', 'url', 'used_at', 'b', 'c']) #set columns names 

print df 
            a  url    used_at  b c 
0 4be390eefaf9a64e7cb52937c4a5c77a  e1.ru 2013-09-30 18:14:58 57 4 
1 4be390eefaf9a64e7cb52937c4a5c77a  e1.ru 2014-09-30 20:11:15 1884 90 
2 4be390eefaf9a64e7cb52937c4a5c77a  e1.ru 2015-10-04 09:44:21 1146 6 
3 4be390eefaf9a64e7cb52937c4a5c77a avito.ru 2016-09-29 21:01:29 48 3 

#create boolean mask, which rows contain years 2014 or 2015 
print df['used_at'].dt.year.isin([2014,2015]) 
0 False 
1  True 
2  True 
3 False 
Name: used_at, dtype: bool 

#filter dataframe by mask 
print df[ df['used_at'].dt.year.isin([2014,2015])] 
            a url    used_at  b c 
1 4be390eefaf9a64e7cb52937c4a5c77a e1.ru 2014-09-30 20:11:15 1884 90 
2 4be390eefaf9a64e7cb52937c4a5c77a e1.ru 2015-10-04 09:44:21 1146 6 

Edit:

Имена столбцов в csv как header, так что вы можете опустить их:

import pandas as pd 

infile = pd.read_csv("avito_trend.csv", 
         parse_dates=[2]) 

print infile 

print infile[ infile['used_at'].dt.year.isin([2014,2015])] 
+0

Когда я 'infile = pd.read_csv (io.StringIO (" avito_trend.csv "), header = None, parse_dates = [2], names = ['ID', 'address', 'used_at ',' active _seconds ',' pageviews ']) 'i get' ID address used_at active_seconds pageviews 0 avito_trend.csv NaN NaT NaN NaN Серия ([], Имя: active_seconds, dtype: float64) ' – ldevyataykina

+0

Вы можете попробовать' infile = pd. read_csv ("avito_trend.csv", header = None, parse_dates = [2], names = ['ID', 'address', 'used_at', 'active_seconds', 'pageviews']) ', omit' io.StringIO' – jezrael

+0

У меня есть ошибка 'TypeError: требуется целое число; KeyError: 'used_at'' – ldevyataykina

2

Вы, кажется, не делать то, что мы просим, ​​так вот код, который показывает, что если вы сделали то, что я спросил, что это будет работать:

In [11]: 
import io 
import pandas as pd 
t="""4be390eefaf9a64e7cb52937c4a5c77a,"e1.ru",2014-09-30 18:14:58,57,4 
4be390eefaf9a64e7cb52937c4a5c77a,"e1.ru",2014-09-30 20:11:15,1884,90 
4be390eefaf9a64e7cb52937c4a5c77a,"e1.ru",2014-10-04 09:44:21,1146,6 
4be390eefaf9a64e7cb52937c4a5c77a,"avito.ru",2014-09-29 21:01:29,48,3""" 
df = pd.read_csv(io.StringIO(t), header=None, parse_dates=[2]) 
df.info() 

<class 'pandas.core.frame.DataFrame'> 
Int64Index: 4 entries, 0 to 3 
Data columns (total 5 columns): 
0 4 non-null object 
1 4 non-null object 
2 4 non-null datetime64[ns] 
3 4 non-null int64 
4 4 non-null int64 
dtypes: datetime64[ns](1), int64(2), object(2) 
memory usage: 192.0+ bytes 

вы можете видеть из вышесказанного следует, что dtype на 3-й колонке теперь datetime64 то вы можете использовать dt.year доступ к компоненту года и groupby в том, что:

In [14]:  
df.groupby(df[2].dt.year).first() 

Out[14]: 
            0  1     2 3 4 
2                  
2014 4be390eefaf9a64e7cb52937c4a5c77a e1.ru 2014-09-30 18:14:58 57 4 

Вы можете задать фильтры или маску с помощью этого атрибута:

In [15]: 
df[2].dt.year 

Out[15]: 
0 2014 
1 2014 
2 2014 
3 2014 
Name: 2, dtype: int64 

можно сравнить выше скалярное значение или тест для членства, используя isin e.t.c.

Что вы пробовали:

datetime.strptime('used_at', "%Y-%m-%d %H:%M:%S") 

бессмысленна strptime принимает строку DATETIME, вы, вероятно, хотел передать столбец:

datetime.strptime(df['used_at'], "%Y-%m-%d %H:%M:%S") 

но это будет не в состоянии, как strptime принимает скалярные значения, а не серия панд.

если ты df['used_at'].apply(lambda x: datetime.strptime(x, "%Y-%m-%d %H:%M:%S")) тогда он будет работать, но это медленно, вы можете использовать to_datetime для достижения того же результата, но это vectorised:

pd.to_datetime(df['used_at']) 
+0

Когда я 'infile = pd.read_csv (io.StringIO (" avito_trend.csv "), header = None, parse_dates = [2], names = ['ID', 'address', 'used_at', 'active_seconds', 'pageviews']) 'i get' ID-адрес used_at active_seconds просмотров страниц 0 avito_trend.csv NaN NaT NaN Серия NaN ([], Имя: active_seconds, dtype: float64) ' – ldevyataykina

+0

Игнорируйте бит' io.StringIO', сделайте это: 'infile = pd.read_csv ("avito_trend.csv", header = None, parse_dates = [2], names = ['ID', 'address', 'used_at', 'active_seconds', 'pageviews']) ' – EdChum

+0

Если я печатаю 'infile = pd.read_csv (" avito_trend.csv ", header = None, parse_dates = [2], names = ['ID', 'address', 'used_at', 'active_seconds', 'pageviews'])' У меня есть ошибка типа – ldevyataykina

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