从时间戳中删除特定字符

时间:2019-06-12 07:20:40

标签: python jupyter-notebook datetime-format python-datetime

我的时间格式比较奇怪,数据帧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)

来自Remove ends of string entries in pandas DataFrame column

但是我收到错误消息:

TypeError: string indices must be integers

我不明白。我只是刚接触python,但看不到我做错了什么?

5 个答案:

答案 0 :(得分:3)

您问题的严格答案是使用str访问器,该访问器可以像普通字符串一样获取一个切片,并将该切片应用于Series中的每个值:< / p>

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 :(得分:1)

一种简单的方法是使用列表理解:

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

答案 2 :(得分:1)

如果您处理任何日期,我建议始终使用datetime软件包。从Python3.7开始,函数fromisoformat可以直接消化您的ISO格式,而strftime可以转换为任何可考虑的时间格式。 (对于Python3.6或更低版本,请参见this答案。)

在您的情况下,时间戳记用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

答案 3 :(得分:0)

请使用以下代码替换转换语句

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

这会将转换功能应用于名为timestamp的整个列,并以相同的列名保存回去

答案 4 :(得分:0)

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])

顺便说一句,您确定不需要保留时区信息吗?