在 pandas 中应用日期时间格式进行排序

Posted

技术标签:

【中文标题】在 pandas 中应用日期时间格式进行排序【英文标题】:Applying datetime format in pandas for sorting 【发布时间】:2016-01-31 12:37:48 【问题描述】:

在 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

【问题讨论】:

【参考方案1】:

因为您已经在处理 datetime 对象,所以您会收到此错误,因为 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.

然后使用strptime 将其带回datetime 对象。下面的演示将演示。请注意在末尾使用.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')

【讨论】:

@Prof 我注意到您删除了已接受的答案。有什么特别的问题吗?或者有没有更简单的方法可以在熊猫中解决这个问题?我是出于好奇而问的:) 我没有接受刚才的答案,因为我意识到我的问题并不清楚。我的代码由一个字符串组成,其中应用了.strptime,然后.strftime 用于将其更改为正确的格式。但是,Pandas 没有正确地对列进行排序,因此我必须使用上面正确排序的格式。此格式为'%Y/%m/%d'。使用这种格式,Pandas 会正确地对列进行排序。但我希望对其进行排序,然后将值返回到最初需要的格式:'%d-%m-%y'. 所以我觉得格式更改必须发生在.to_datetimedf[].apply 内部。还没说完,你就意识到我没有接受,我很抱歉! 你有什么想法吗? 抱歉。不是故意让你上吊。对于更改格式时的数据顺序,我不太确定。我实际上并没有那么多使用熊猫。对不起。 =/【参考方案2】:

部分问题的解决方案:

我想将此格式更改为另一种格式:%d-%m-%y(例如 31-10-15)。

...如果日期以默认 ISO 标准以外的任何方式输入 pandas 数据框,则排序时会出现奇怪的结果。例如格式不一致和/或排序不正确

其实很简单。 Pandas 遇到问题是因为它认为 dd-mm-yy 格式是国际格式,并且必须输入额外的 dayfirst 参数才能正确处理:

df['Date'] = pd.to_datetime(df['Date'], dayfirst = [True])

可能还需要这个(目前用于解析数据但不显示):

pd.set_option('display.date_dayfirst', True)

【讨论】:

以上是关于在 pandas 中应用日期时间格式进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Pandas 数据框中按行值对日期时间列进行排序?

pandas.read_csv() 可以在同一列中应用不同的日期格式!这是一个已知的错误吗?如何解决?

如何防止 pandas 将原始数据库日期格式转换为 pandas 日期格式

python pandas groupby plot,排序日期为 xtick

Pandas 条形图更改日期格式

如何将 pandas 数据框导出为 json 并保留原始日期时间格式?