2016-12-11 2 views
0

Я делаю это для домашней работы.Преобразование столбца данных из года в год, год год

Моя цель состоит в том, чтобы иметь совершенно новую колонку только с прошедшими днями. Есть 500 000 строк этого ... так что моя цель состоит в том, чтобы:

  1. В кадре данных Pandas у меня есть эти два столбца даты, которые находятся в разных форматах. Я бы хотел вычесть эти два столбца, а затем создать новый столбец «Истекший день», который является простым целым списком.
  2. Выход в новый CSV (этот код делается)
  3. Теперь я могу полностью избежать парсинга дат каждый раз, когда я перерабатываю код/​​читаю CSV, потому что он сходит с ума и замедляет мою работу.

Я пытаюсь преобразовать это:

Yearmade   Saledate 
0  2004 11/16/2006 0:00 
1  1996 3/26/2004 0:00 
2  2001 2/26/2004 0:00 

В:

 Days Elapsed 
0  1050 
1  3007 
2  1151 

Текущая попытка:

year_mean = df[df['YearMade'] > 1000]['YearMade'].mean() 
df.loc[df['YearMade'] == 1000, 'YearMade'] = year_mean 
## There's lots of erroneous data of the year 1000, so replacing all of them with the mean of the column (mean of column without error data, that is) 
df['Yearmade'] = "1/1/"+df['YearMade'].astype(str) 
## This is where it errors out. 
df['Yearmade'] = pd.to_datetime(df['Yearmade']) 
df['Saledate'] = pd.to_datetime(df['Saledate']) 
df['Age_at_Sale'] = df['Saledate'].sub(df['Yearmade']) 
df = df.drop(['Saledate', 'Yearmade'], axis=1) 

[then there's another class method to convert the current df into csv] 
+0

Я предполагаю, что вы знаете, но CSV очень медленно и неэффективно (хранение мудро) по сравнению с различными форматами двоичных (HDF и т.д.) Панды имеют множество вариантов: HTTP: // pandas.pydata.org/pandas-docs/stable/io.html – JohnE

+0

Только что начал изучать панды/CSV на этой неделе - теперь узнайте о HDF с вашей ссылкой! – jhub1

+0

@JohnE Мне нужно сделать много печати, чтобы подтвердить, правильно ли я очищаю данные. Было бы целесообразно преобразовать большой CSV в HDF ... сначала, а затем начать спорить? – jhub1

ответ

1

если у вас есть следующие DF:

Решение:

In [204]: df.loc[df.Yearmade <= 1900, 'Yearmade'] = round(df.Yearmade.loc[df.Yearmade > 1900].mean()) 

In [205]: df 
Out[205]: 
    Yearmade Saledate 
0  2004 2006-11-16 
1  1996 2004-03-26 
2  2001 2004-02-26 
3  2000 2003-12-23 # <--- replaced with avg. year 

In [206]: df['days'] = (pd.to_datetime(Saledate) - pd.to_datetime(df.Yearmade, format='%Y')).dt.days 

In [207]: df 
Out[207]: 
    Yearmade Saledate days 
0  2004 2006-11-16 1050 
1  1996 2004-03-26 3007 
2  2001 2004-02-26 1151 
3  2000 2003-12-23 1452 
+0

Yikes. Он ошибается, потому что существует множество ошибочных данных, таких как год 1000. Я просто попытался заменить год средствами, но он не работает. год_mean = self.df [self.df ['YearMade']> 1000] ['YearMade']. Mean() # print 'Mean is {}'. Format (year_mean) self.df.loc [self .df ['YearMade'] == 1000, 'YearMade'] = year_mean pandas.tslib.OutOfBoundsDatetime: за пределами наносекундной метки времени: 1000-01-01 00:00:00 – jhub1

+0

@ jhub1, ​​что вы собираетесь делать с ошибочными годами? – MaxU

+0

Итак, я добавил больше кода, но мое текущее мышление таково: Получите среднее значение за все годы, превышающее 1900 год. Замените все годы ниже 1900 года. – jhub1

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