Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从时间戳中删除特定字符_Python_Jupyter Notebook_Datetime Format_Python Datetime - Fatal编程技术网

Python 从时间戳中删除特定字符

Python 从时间戳中删除特定字符,python,jupyter-notebook,datetime-format,python-datetime,Python,Jupyter Notebook,Datetime Format,Python Datetime,我有一个非常奇怪的时间格式,数据帧df带有列时间戳: 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

我有一个非常奇怪的时间格式,数据帧
df
带有列
时间戳

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)

但我收到了错误:

TypeError: string indices must be integers

我不明白。我刚刚接触python,但我没有发现我做错了什么?

请用下面的代码替换转换语句

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

这将对名为time stamp的整个列应用转换函数,并使用相同的列名将其保存回来。您的问题的严格答案是使用
str
访问器,它可以像普通字符串一样获取一个片段,并将该片段应用于
系列中的每个值:

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
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)]
但是,我认为您需要的实际上是
pd.to_datetime
,这将(在合理范围内)推断数据的格式并将其转换为
datetime
对象:

print(pd.to_datetime(s))
输出:

0    2016-10-25T09:34:52
1    2016-10-25T09:46:14
2    2016-10-25T09:51:16
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)]

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

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
顺便说一句,你确定你不需要保留时区信息吗?

如果你处理任何类型的日期,我建议始终使用软件包。从Python3.7开始,函数可以直接消化ISO格式,同时可以转换为任何可思考的时间格式。(对于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

非常感谢。最后一个括号太多了。但我收到了错误:KeyError:'时间戳'。这意味着什么?当你移除最后一个部分时,当DST发挥作用时,你可能会遇到麻烦。这将改变时区,操作后可能会有不一致的数据。您可以考虑,而不是修剪时间戳,纠正它,并将其转换为UTC.thanks的提示!什么是DST?DST代表什么。