【问题标题】:Reading dates in different formats from a file and sorting them从文件中读取不同格式的日期并对其进行排序
【发布时间】:2017-09-06 07:39:22
【问题描述】:

这个问题类似于this 一个,我最初用这个解决方案回答了这个问题,但结果我误读了这个问题。不过,我觉得我的 answer 对于稍微不同的用例会很有用,所以我把它贴在这里。


给定一个文本文件:

04/20/2009; 04/20/09; 4/20/09; 4/3/09
Mar-20-2009; Mar 20, 2009; March 20, 2009; Mar. 20, 2009; Mar 20 2009;
20 Mar 2009; 20 March 2009; 20 Mar. 2009; 20 March, 2009
Mar 20th, 2009; Mar 21st, 2009; Mar 22nd, 2009
Feb 2009; Sep 2009; Oct 2010
6/2008; 12/2009
2009; 2010

包含已提取的各种格式的日期...任务是将它们读入数据框,然后对其进行排序,然后以 MM/DD/YYYY 格式显示输出。

预期输出:

0     06/01/2008
1     01/01/2009
2     02/01/2009
3     03/20/2009
4     03/20/2009
5     03/20/2009
6     03/20/2009
7     03/20/2009
8     03/20/2009
9     03/20/2009
10    03/20/2009
11    03/20/2009
12    03/20/2009
13    03/21/2009
14    03/22/2009
15    04/03/2009
16    04/20/2009
17    04/20/2009
18    04/20/2009
19    09/01/2009
20    12/01/2009
21    01/01/2010
22    10/01/2010

如何在 pandas 中做到这一点?

注意:如果缺少这一天,请考虑 1 日,如果缺少月份,请考虑 1 月。

【问题讨论】:

  • 我在什么地方见过这个。
  • @Bharathshetty 是的。检查link。但 OP 想要一些不同的东西。
  • 不是那个。我想也许是一个课程作业。

标签: python pandas sorting date dataframe


【解决方案1】:

更简单的应该是只省略一次applyreset_index

在我看来,drop=1 的可读性不如drop=True

out = pd.to_datetime(df.stack()).sort_values().dt.strftime('%m/%d/%Y').reset_index(drop=True)
print(out)
0     06/01/2008
1     01/01/2009
2     02/01/2009
3     03/20/2009
4     03/20/2009
5     03/20/2009
6     03/20/2009
7     03/20/2009
8     03/20/2009
9     03/20/2009
10    03/20/2009
11    03/20/2009
12    03/20/2009
13    03/21/2009
14    03/22/2009
15    04/03/2009
16    04/20/2009
17    04/20/2009
18    04/20/2009
19    09/01/2009
20    12/01/2009
21    01/01/2010
22    10/01/2010
dtype: object

【讨论】:

  • 很好...你删除了申请。
  • 我认为你想要df.apply(pd.to_datetime).stack() - 然后apply 是必要的。也许这是起源的想法。
【解决方案2】:

可重现的设置(用于简单的 MCVE):

import pandas as pd
import io

text = '''04/20/2009; 04/20/09; 4/20/09; 4/3/09
Mar-20-2009; Mar 20, 2009; March 20, 2009; Mar. 20, 2009; Mar 20 2009;
20 Mar 2009; 20 March 2009; 20 Mar. 2009; 20 March, 2009
Mar 20th, 2009; Mar 21st, 2009; Mar 22nd, 2009
Feb 2009; Sep 2009; Oct 2010
6/2008; 12/2009
2009; 2010'''

buf = io.stringIO(text)

df = pd.read_csv(buf, engine='python', delimiter=';\s+', header=None).reset_index()

df

            index               0               1               2  \
0      04/20/2009        04/20/09         4/20/09          4/3/09   
1     Mar-20-2009    Mar 20, 2009  March 20, 2009   Mar. 20, 2009   
2     20 Mar 2009   20 March 2009    20 Mar. 2009  20 March, 2009   
3  Mar 20th, 2009  Mar 21st, 2009  Mar 22nd, 2009            None   
4        Feb 2009        Sep 2009        Oct 2010            None   
5          6/2008         12/2009            None            None   
6            2009            2010            None            None   

              3  
0          None  
1  Mar 20 2009;  
2          None  
3          None  
4          None  
5          None  
6          None 

buf 替换为您的文本文件的名称。


您可以使用df.applydf.stack,然后使用pd.Series.sort_values

out = df.stack().apply(pd.to_datetime)\
        .reset_index(drop=1)\
        .sort_values().dt.strftime('%m/%d/%Y')\
        .reset_index(drop=1)
print(out)

0     06/01/2008
1     01/01/2009
2     02/01/2009
3     03/20/2009
4     03/20/2009
5     03/20/2009
6     03/20/2009
7     03/20/2009
8     03/20/2009
9     03/20/2009
10    03/20/2009
11    03/20/2009
12    03/20/2009
13    03/21/2009
14    03/22/2009
15    04/03/2009
16    04/20/2009
17    04/20/2009
18    04/20/2009
19    09/01/2009
20    12/01/2009
21    01/01/2010
22    10/01/2010

【讨论】:

    猜你喜欢
    • 2020-05-27
    • 2018-02-14
    • 2011-08-04
    • 2022-10-13
    • 1970-01-01
    • 2018-05-29
    • 1970-01-01
    • 2015-12-27
    • 2021-04-05
    相关资源
    最近更新 更多