2015-05-22 14 views
17

Przepraszamy za to pytanie, które wydaje się powtarzalne - oczekuję, że odpowiedź sprawi, że poczuję się jak kościec. .. ale nie miałem szczęścia używając odpowiedzi na podobne pytania na SO.Python python wyciąg rok z datetime --- df ['rok'] = df ['date']. Rok nie działa

Importuję dane przez read_csv, ale z jakiegoś powodu, którego nie mogę wymyślić, nie jestem w stanie wyodrębnić roku lub miesiąca z serii danych df['date'].

date Count 
6/30/2010 525 
7/30/2010 136 
8/31/2010 125 
9/30/2010 84 
10/29/2010 4469 

df = pd.read_csv('sample_data.csv',parse_dates=True) 

df['date'] = pd.to_datetime(df['date']) 

df['year'] = df['date'].year 
df['month'] = df['date'].month 

Ale to zwraca:

AttributeError: 'Series' object has no attribute 'year'

góry dziękuję.

UPDATE:

df = pd.read_csv('sample_data.csv',parse_dates=True) 

df['date'] = pd.to_datetime(df['date']) 

df['year'] = df['date'].dt.year 
df['month'] = df['date'].dt.month 

ten generuje takie same "AttributeError: obiekt 'seria' ma atrybut 'dt'"

Kontynuacja:

Używam Spyder 2.3.1 z Python 3.4.1 64bit, ale nie może zaktualizować pandy do nowszej wersji (obecnie 0.14.1). Każdy z poniższych generuje nieprawidłowy błąd składni:

conda update pandas 
 

 
conda install pandas==0.15.2 
 

 
conda install -f pandas

jakieś pomysły?

+0

skąd się bierze rok? Czy próbujesz uzyskać dostęp do wiersza '(df [" date "] [0] .year'? –

+0

Mam plik csv z datami i innymi kolumnami, które wszystkie wyszły z SQL jako dane ciągu. Próbuje utworzyć nowy rok i miesiąc kolumny do użycia w celu grupowania, csv ma ​​~ 5000 wierszy – MJS

+0

Tak, ale "df [" date "]' to obiekt 'pandas.core.series.Series'', co powinno" df ['date']. year? be? –

Odpowiedz

35

Jeśli używasz niedawnym-owski wersję pandy to można użyj atrybutu datetime dt, aby uzyskać dostęp do komponentów datetime:

In [6]: 

df['date'] = pd.to_datetime(df['date']) 
df['year'], df['month'] = df['date'].dt.year, df['date'].dt.month 
df 
Out[6]: 
     date Count year month 
0 2010-06-30 525 2010  6 
1 2010-07-30 136 2010  7 
2 2010-08-31 125 2010  8 
3 2010-09-30  84 2010  9 
4 2010-10-29 4469 2010  10 

EDIT

Wygląda używasz starszej wersji pandy w takim przypadku następuje to działa:

In [18]: 

df['date'] = pd.to_datetime(df['date']) 
df['year'], df['month'] = df['date'].apply(lambda x: x.year), df['date'].apply(lambda x: x.month) 
df 
Out[18]: 
     date Count year month 
0 2010-06-30 525 2010  6 
1 2010-07-30 136 2010  7 
2 2010-08-31 125 2010  8 
3 2010-09-30  84 2010  9 
4 2010-10-29 4469 2010  10 

o przyczynach nie analizować to do datetime w read_csv musisz podać pozycję porządkową swojej kolumny ([0]), ponieważ kiedy True spróbuje parsować kolumny [1,2,3], zobacz docs

In [20]: 

t="""date Count 
6/30/2010 525 
7/30/2010 136 
8/31/2010 125 
9/30/2010 84 
10/29/2010 4469""" 
df = pd.read_csv(io.StringIO(t), sep='\s+', parse_dates=[0]) 
df.info() 
<class 'pandas.core.frame.DataFrame'> 
Int64Index: 5 entries, 0 to 4 
Data columns (total 2 columns): 
date  5 non-null datetime64[ns] 
Count 5 non-null int64 
dtypes: datetime64[ns](1), int64(1) 
memory usage: 120.0 bytes 

Więc jeśli przechodzą param parse_dates=[0] do read_csv nie powinno być żadnej potrzeby, aby zadzwonić to_datetime na kolumnie „data” po załadunku.

+0

Ed - miałeś rację, jestem na 0.14.1 przepraszam Spróbuję zaktualizować – MJS

+0

Moje aktualizacje powinny działać na twojej wersji, także n Uwaga: 'parse_dates = [0]' dla 'read_csv' poprawnie analizuje ciągi daty w obiektach datetime, więc nie potrzebujesz dodatkowego' to_datetime' połączenia – EdChum

6

to działa:

df['date'].dt.year 

Teraz:

df['year'] = df['date'].dt.year 
df['month'] = df['date'].dt.month 

daje tę ramkę danych:

 date Count year month 
0 2010-06-30 525 2010  6 
1 2010-07-30 136 2010  7 
2 2010-08-31 125 2010  8 
3 2010-09-30  84 2010  9 
4 2010-10-29 4469 2010  10 
1

Co pracował dla mnie było uaktualnienie pandy do najnowszej wersji:

z linii poleceń zrobić:

conda update pandas 
-1
20010101 
20010101 
20010201 
20010201 
20011121 
20011121 
20011221 

mam 55k rzędy terminach, trzeba wyodrębnić i numer działki miesiące, tygodnie i dni na przykład

Feb-2001 4 
Jul-2002 3 
Nov-2014 7 

Poniższy kod daje mi tylko 12 miesięcy na osi X, co ja potrzeba 180 miesięcy (od 2001 do 2015)

import pandas as pd 
import matplotlib.pyplot as plt 
from datetime import datetime 
df = pd.read_csv('rr.csv') 
df['COLLISION_DATE'] = pd.to_datetime(df['COLLISION_DATE'],format='%Y%m%d') 
df['week'], df['month'], df['year'],df['day'] = df['COLLISION_DATE'].dt.week, df['COLLISION_DATE'].dt.month, df['COLLISION_DATE'].dt.year,df['COLLISION_DATE'].dt.day 
answer = df.groupby('month').size().to_frame('Number of Accidents') 
answer.plot.line() 
plt.show() 
+0

Proszę zaksięguj to jako pytanie, a nie jako odpowiedź na cudze pytanie. –