我的时间格式比较奇怪,数据帧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,但看不到我做错了什么?
答案 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])
顺便说一句,您确定不需要保留时区信息吗?