在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')

10-04 21:41
查看更多