在Pandas中,我有一列的日期格式为:%Y /%m /%d(例如2015/10/31)。我想将此格式更改为另一种格式:%d-%m-%y(例如31-10-15)。
将列变成正确的对象,以便以后进行排序:
df['Date'] = pd.to_datetime(df['Date'])
应用strptime:
df['Date'] = df['Date'].apply(lambda x:
datetime.strptime(x,'%d-%m-%y'))
TypeError: must be str, not Timestamp
同样,奇怪的是,如果日期以默认ISO标准以外的任何其他方式输入pandas数据框,则排序时会出现奇怪的结果。例如格式不一致和/或排序不正确:
0 2015-01-31
1 2016-15-01
最佳答案
因为您已经在处理日期时间对象,所以出现此错误是因为strptime
需要字符串而不是Timestamp
对象。根据strptime
的定义:
def strptime(cls, date_string, format):
'string, format -> new datetime parsed from a string (like time.strptime()).'
您实际上要执行的操作是首先使用
strftime
将日期时间转换为所需的字符串格式:def strftime(self, format):
"""Return a string representing the date and time, controlled by an
explicit format string.
然后使用
datetime
将其带回到strptime
对象。以下演示将进行演示。请注意最后使用.date()
以便删除不需要的00:00:00
时间部分。>>> from datetime import datetime
>>> orig_datetime_obj = datetime.strptime("2015/10/31", '%Y/%m/%d').date()
>>> print(orig_datetime_obj)
2015-10-31
>>> print(type(orig_datetime_obj))
<type 'datetime.datetime'>
>>> new_datetime_obj = datetime.strptime(orig_datetime_obj.strftime('%d-%m-%y'), '%d-%m-%y').date()
>>> print(new_datetime_obj)
2015-10-31
>>> print(type(new_datetime_obj))
<type 'datetime.date'>
另外,如果您只需要将其转换为其他格式但以字符串形式转换,则可以简单地坚持使用新格式的
strftime
。使用上面的示例,您只需要以下部分:orig_datetime_obj.strftime('%d-%m-%y')