【问题标题】:Best date-format to use and sort with PandasPandas 使用和排序的最佳日期格式
【发布时间】:2020-02-05 21:02:47
【问题描述】:

我正在创建一个大型 Excel 文件,我将把它读入 Pandas 进行分析。其中一列包含日期。因为我刚刚开始这个项目,所以我可以使用最有效的日期格式。问题是,我不知道要使用哪种日期格式以及如何按日期正确排序。

一个潜在的问题是,有些日期仅是年,有些是年-月,有些是年-月-日。

1997
1999
1997
1997-03
1997-10-31
2000-11

我希望能够使用 Pandas 按日期排序并最终得到:

2000-11
1999
1997-10-31
1997-03
1997
1997

如果先年,然后年-月,然后年-月-日更容易,那么以下也可以;只要将所有仅限年份的日期组合在一起即可。

2000-11
1999
1997
1997
1997-10-03
1997-03

我尝试使用 pd.to_datetime 将它们转换为日期时间对象,但我迷失了是否需要将它们转换回字符串(以便将它们打印出来)。

我相信有一种更简单的方法可以做到这一点,特别是因为我可以创建我喜欢的日期格式。

什么是最好的日期格式,什么是按日期排序的最佳方式(对于这种情况)?

谢谢!

【问题讨论】:

  • 您不需要将日期时间转换回字符串来打印它。
  • 我将它们转换为字符串以避免使用(index=False) 打印索引,我还没有想出其他方法;但是,这已经跑题了,现在打印或不打印索引对我来说并不是一个大问题:)

标签: python pandas dataframe


【解决方案1】:

您描述的排序只是词法排序。因此,您可以将列保持为字符串类型,并且排序行为符合预期。

示例:

df = pd.DataFrame({'datecol': ['1997', '1999', '1997-03', '1997-10-31', '2000-11']})

df.datecol.sort_values(ascending=False)
# prints:
4       2000-11
1          1999
3    1997-10-31
2       1997-03
0          1997
Name: datecol, dtype: object

然而,事情并不那么简单。

考虑1997 是如何小于1997-10-31 的。

只有当1997 表示介于1997-01-011997-10-30 之间的日期值时,才会发生这种情况。但是,您也希望在1997-03 之前订购1997。这意味着19971997-01-011997-02-28 之间的某个值。

如果有一个值1997-01,你会期待什么。是在1997 之前还是之后排序,或者这两个值是否被认为是等价的并且也等价于1997-01-01

另一种选择是将所有部分日期转换为完整日期,如果需要,通过某些规则分配月份和日期值。根据您提供的排序示例,一个合理的规则是,如果缺失,则将日期值设置为月份的第一天,如果缺失,则将月份值设置为一月。

此行为是函数pd.to_datetime的默认行为

df['date_conv'] = pd.to_datetime(df.datecol)
df.sort_values('date_conv', ascending=False)
df
# outputs:
      datecol  date_conv
4     2000-11 2000-11-01
1        1999 1999-01-01
3  1997-10-31 1997-10-31
2     1997-03 1997-03-01
0        1997 1997-01-01

如您所见,保留了预期的顺序

【讨论】:

  • 谢谢你,哈利穆尔。不幸的是,将部分日期转换为任意日期不是一种选择。仅年份日期在年-月和年-月-日日期之前还是之后并不重要(只是它们被组合在一起)。我已经更新了我的帖子以帮助解决这个问题。
【解决方案2】:

对于碰巧发现自己处于这种情况的任何人,@Haleemur Ali 都在正确的轨道上;即将 YYYY 和 YYYY/MM 日期转换为 YYYY/MM/DD 日期。

由于我不想将1991 之类的日期替换为1991-01-01 的任意日期,因此解决方案是:

使用.astype('str') 将日期显式转换为字符串;尽管这些显然已经是字符串,但不这样做会导致下一步出现不希望的日期。

使用现有日期创建一个临时日期列,并使用pd.to.datetime 转换这些日期。

sort_values 使用临时日期列。 这会保留原始Date 列的格式。 之后,可以删除临时日期列。

【讨论】:

    猜你喜欢
    • 2011-09-22
    • 2021-06-13
    • 2016-01-31
    • 2020-04-11
    • 1970-01-01
    • 2023-03-13
    • 2023-04-05
    • 2019-02-15
    • 1970-01-01
    相关资源
    最近更新 更多