Разделение ячеек внутри фрейма данных - PullRequest
2 голосов
/ 02 августа 2020

У меня есть CSV, который я считываю в фрейм данных, чтобы удалить определенные столбцы и выполнить некоторые манипуляции.

Вот некоторые примеры строк:

20        2/5/1954 13:55          0.5           18
21        2/5/1954 14:35          0.5         18.2
22        2/5/1954 16:35          0.5         18.5

Я хочу исключить время в datetime, так что, например, я получаю 2/5/1954 вместо 2/5/1954 13:55.

Я написал этот скрипт:

import pandas as pd
from datetime import datetime as dt

df = pd.read_csv('habsos_20200310.csv', sep=',', error_bad_lines=False, index_col=False, dtype='unicode')

pd.set_option('display.max_rows', None)

# Get only the columns we care about
dfSub = df[['sample_date','sample_depth','water_temp']]

# Remove the NaN values
dfClean = dfSub.dropna()

# Select 0.5 depth measurements only
dfClean2 = dfClean.loc[df['sample_depth'] == '0.5']

print(dfClean2)

Что дает мне:

             sample_date sample_depth   water_temp
20        2/5/1954 13:55          0.5           18
21        2/5/1954 14:35          0.5         18.2
22        2/5/1954 16:35          0.5         18.5
23        2/5/1954 16:52          0.5         18.5
24        2/5/1954 17:10          0.5         18.6
25        2/5/1954 17:25          0.5         18.8
26        2/5/1954 17:43          0.5           19

Я попытался добавить эти строки в свой сценарий, чтобы преобразовать столбец sample_date:

new_df = dfClean2['sample_date'].str.split()[0]

print(new_df)

Но я получаю эту ошибку:

$ python3 habsos.py 
Traceback (most recent call last):
  File "habsos.py", line 22, in <module>
    new_df = dfClean2['sample_date'].str.split()[0]
  File "/home/reallymemorable/.pyenv/versions/3.5.9/lib/python3.5/site-packages/pandas/core/series.py", line 1071, in __getitem__
    result = self.index.get_value(self, key)
  File "/home/reallymemorable/.pyenv/versions/3.5.9/lib/python3.5/site-packages/pandas/core/indexes/base.py", line 4730, in get_value
    return self._engine.get_value(s, k, tz=getattr(series.dtype, "tz", None))
  File "pandas/_libs/index.pyx", line 80, in pandas._libs.index.IndexEngine.get_value
  File "pandas/_libs/index.pyx", line 88, in pandas._libs.index.IndexEngine.get_value
  File "pandas/_libs/index.pyx", line 131, in pandas._libs.index.IndexEngine.get_loc
  File "pandas/_libs/hashtable_class_helper.pxi", line 992, in pandas._libs.hashtable.Int64HashTable.get_item
  File "pandas/_libs/hashtable_class_helper.pxi", line 998, in pandas._libs.hashtable.Int64HashTable.get_item
KeyError: 0

Как я могу изменить свой сценарий так что я получаю это как выход?

             sample_date sample_depth   water_temp
20        2/5/1954               0.5           18
21        2/5/1954               0.5         18.2
22        2/5/1954               0.5         18.5
...

1 Ответ

2 голосов
/ 02 августа 2020

В комментариях уже предлагалось использовать expand=True. Другой вариант -

dfClean2.sample_date = dfClean2.sample_date.str.split(' ').str.get(0)

Однако, pandas имеет много методов, реализованных для dtype datetime. Я рекомендую передать параметр parse_dates=True в .read_csv() ( обрабатывать дату и время с помощью read_csv ) и использовать в этом столбце аксессор серии .dt.

dfClean2.sample_date = dfClean2.sample_date.dt.date

Подробнее о аксессорах .dt на официальном сайте pandas:

Ссылка

Руководство пользователя

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...