2016-01-30 1 views
0
года

Я хочу напечатать только года с помощью следующего кода, но это, кажется, подвержены ошибкам, я попробовал и задавал много раз, но не получил правильногокак получить перебирать список времени даты, чтобы получить

import pandas as pd 
from datetime import datetime 

data = pd.read_csv('Meteorite_Landings.csv') 
a = str(data["year"]) 
print a 
for i, val in enumerate(a): 
    b=[datetime.strptime(date, '%m/%d/%Y %H:%M:%S %p').year for date in a] 
    print b 

Я получаю эту ошибку

Traceback (most recent call last): File "C:/Users/shiv/Desktop/new_date_times.py", line 9, in b=[datetime.strptime(date, '%m/%d/%Y %H:%M:%S %p').year for date in a] File "C:\Python27\lib_strptime.py", line 325, in _strptime (data_string, format)) ValueError: time data '0' does not match format '%m/%d/%Y %H:%M:%S %p'

enter image description here

enter image description here

+1

'a' - это строка. Если вы повторите это, вы получите персонажей одновременно. Я не знаком с пандами, но какой тип 'data'? Попробуйте выполнить 'data ["year"] 'непосредственно, не отбрасывая его на строку. – L3viathan

+0

Публикация образца файла csv была бы огромной помощью здесь. Кроме того, как отметил @ L3viathan, вы перекодировали 'a' в строку, так что итерация по ней просто дает вам один символ за раз, чтобы перейти в strptime. –

+1

вы также должны размещать здесь часть или соответствующий параметр CSV, иначе мудрее довольно сложно догадаться, какой будет правильный формат. – Oz123

ответ

1

Я предлагаю это решение, которое не сильно отклоняется от вашего:

import pandas as pd 
from datetime import datetime 

data = pd.read_csv('Meteorite_Landings.csv') 

for i, val in enumerate(data["year"]): 
    try: 
     b = datetime.strptime(val, '%m/%d/%Y %H:%M:%S %p').year 
     print b 
    except TypeError: 
     pass 

Это печатает годы. Причина попытки - исключить то, что the dataset you're probably using не является полным и содержит некоторые NAN (?).

2

Без файла csv, который вы пытаетесь прочитать, я не могу быть на 100% уверенным, но похоже, что вы пытаетесь преобразовать столбец «год» в datetime, а затем извлечь из этого год. Вы уверены, что нужный столб называется «годом»? Вы уверены, что каждая строка имеет значение в этом столбце? Вы уверены, что каждое единственное значение в этом столбце следует в том же формате и что это формат, который вы используете в strptime? Мне кажется странным, что столбец с именем «год» будет содержать всю дату. Публикация образца файла csv была бы огромной помощью. Сделав некоторые предположения о вышеупомянутых вопросах, я придумал следующий код, измененный из вашего примера.

import pandas as pd 
from datetime import datetime 

data = pd.read_csv('Meteorite_Landings.csv') 

b=[datetime.strptime(date, '%m/%d/%Y %H:%M:%S %p').year for date in data["year"]] 

print b 
+0

Я отредактировал сообщение. может быть полным, но выше одного дает ошибку b = [datetime.strptime (date, '% m /% d /% Y% H:% M:% S% p'). year for date in data ["year" ]] TypeError: должен быть строкой, а не плавать –

+0

@HariRama Можете ли вы опубликовать первые несколько строк csv-файла? Как текст, а не скриншот. –

1

Могу ли я предложить другой подход для решения вашей проблемы? Вы читаете CSV с пандами, а затем повторяете его. Это ужасно медленно и имеет недостаток в том, что вы не используете Pandas API. Вместо этого прочитайте файл следующим образом:

dateparse = lambda x: pd.datetime.strptime(x, '%Y-%m-%d %H:%M:%S') 

df = pd.read_csv('Meteorite_Landings.csv', parse_dates=['datetime'], date_parser=dateparse) 

Обратите внимание, что вам необходимо адаптировать строковый формат к вашему правильному. Теперь вы будете иметь столбец системной даты кадр с датой, и вы можете получить прямой доступ к year, как в этом примере:

In [1]: import datetime 
In [2]: obj = datetime.datetime.now() 

In [3]: obj.year 
Out[3]: 2016