удалить определенные символы из отметки времени - PullRequest
3 голосов
/ 12 июня 2019

У меня довольно странный формат времени и фрейм данных df со столбцом TIMESTAMP:

2016-10-25T09:34:52.051713+01:00
2016-10-25T09:46:14.051620+01:00
2016-10-25T09:51:16.052435+01:00
....

но мне нужно использовать данные в качестве информации о времени. Во-первых, я хотел бы избавиться от последних 13 символов так, чтобы это выглядело как

2016-10-25T09:34:52
2016-10-25T09:46:14
2016-10-25T09:51:16
....

Для этого я попытался

df['TIMESTAMP'] = df.apply(lambda x: x['TIMESTAMP'][:-13], axis = 1)

из Удалить концы строковых записей в столбце DataFrame панд

но я получаю ошибку:

TypeError: string indices must be integers

которого я не понимаю. Я просто новичок в питоне, но я не вижу много, что я сделал неправильно?

Ответы [ 5 ]

3 голосов
/ 12 июня 2019

Строгий ответ на ваш вопрос заключается в использовании аксессора str, который может принимать срез, как обычная строка, и который будет применять этот срез к каждому значению в Series:

data = ['2016-10-25T09:34:52.051713+01:00',
        '2016-10-25T09:46:14.051620+01:00',
        '2016-10-25T09:51:16.052435+01:00']

s = pd.Series(data)

print(s.str[:-13])

Вывод:

0    2016-10-25T09:34:52
1    2016-10-25T09:46:14
2    2016-10-25T09:51:16

Однако , я думаю, что вы на самом деле хотите pd.to_datetime, который (в пределах разумного) выведет формат ваших данных и преобразует их вdatetime объекты:

print(pd.to_datetime(s))

Вывод:

0   2016-10-25 09:34:52.051713+01:00
1   2016-10-25 09:46:14.051620+01:00
2   2016-10-25 09:51:16.052435+01:00
dtype: datetime64[ns, pytz.FixedOffset(60)]
1 голос
/ 12 июня 2019

Я рекомендую всегда использовать пакет datetime, если вы имеете дело с любыми датами. Начиная с Python3.7, функции fromisoformat могут напрямую переваривать ваш формат ISO, в то время как strftime могут преобразовываться в любой мыслимый формат времени. (Для Python3.6 или ниже см. этот ответ).

В вашем случае с отметками времени, написанными в df['TIMESTAMP']:

from datetime import datetime as dt
df['TIMESTAMP'].apply(lambda x: dt.strftime(dt.fromisoformat(x), '%Y-%m-%dT%H:%M:%S'))

выполнит трюк и выдаст желаемый результат:

             TIMESTAMP
0  2016-10-25T09:34:52
1  2016-10-25T09:46:14
2  2016-10-25T09:51:16
1 голос
/ 12 июня 2019

Простой способ сделать это - использовать понимание списка:

df = pd.DataFrame({'TIMESTAMP' : ["2016-10-25T09:34:52.051713+01:00", "2016-10-25T09:46:14.051620+01:00"]})

 TIMESTAMP
0  2016-10-25T09:34:52.051713+01:00
1  2016-10-25T09:46:14.051620+01:00

df['TIMESTAMP'] = [x[:-13] for x in df['TIMESTAMP']]

Выход:

TIMESTAMP
0  2016-10-25T09:34:52
1  2016-10-25T09:46:14
0 голосов
/ 12 июня 2019
df = pd.DataFrame(
    data={
        'TIMESTAMP': [
            '2016-10-25T09:34:52.051713+01:00',
            '2016-10-25T09:46:14.051620+01:00',
            '2016-10-25T09:51:16.052435+01:00'
        ]
    }
)
df['TIMESTAMP'] = df['TIMESTAMP'].apply(lambda x: x[:19])

Кстати, вы уверены, что вам не нужно хранить информацию о часовом поясе?

0 голосов
/ 12 июня 2019

Пожалуйста, замените оператор преобразования следующим кодом:

df['TIMESTAMP'] = df['TIMESTAMP'].apply(lambda x: x[-4:])

Это позволит применить функцию преобразования ко всему столбцу с именем отметки времени и сохранить его с тем же именем столбца

...