【问题标题】:How to split one row into multiple and apply datetime on dataframe column?如何将一行拆分为多个并在数据框列上应用日期时间?
【发布时间】:2019-01-23 16:43:28
【问题描述】:

我有一个如下所示的数据框:

                   Date_1                Date_2
0                5 Dec 2017                5 Dec 2017
1               14 Dec 2017               14 Dec 2017
2               15 Dec 2017               15 Dec 2017
3   18 Dec 2017 21 Dec 2017   18 Dec 2017 21 Dec 2017
4              22 Dec 2017               22 Dec 2017

要检查的条件:

  1. 想要检查任何行是否包含两个日期,或者不像第 3 行。如果存在,将它们分成两个单独的行。
  2. 在两列上应用日期时间。

我正在尝试执行如下相同的操作:

df['Date_1'] = pd.to_datetime(df['Date_1'], format='%d %b %Y')

但出现以下错误:

ValueError: unconverted data remains:

预期输出:

                   Date_1                Date_2
0                5 Dec 2017               5 Dec 2017
1               14 Dec 2017               14 Dec 2017
2               15 Dec 2017               15 Dec 2017
3               18 Dec 2017               18 Dec 2017 
4               21 Dec 2017               21 Dec 2017
5               22 Dec 2017                22 Dec 2017

【问题讨论】:

    标签: python pandas datetime


    【解决方案1】:

    使用正则表达式和findall 获取你的日期后,你的问题变成了unnesting 问题

    s=df.apply(lambda x : x.str.findall(r'((?:\d{,2}\s)?(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]*(?:-|\.|\s|,)\s?\d{,2}[a-z]*(?:-|,|\s)?\s?\d{,4})'))
    
    unnesting(s,['Date_1','Date_2']).apply(pd.to_datetime)
    Out[82]: 
          Date_1     Date_2
    0 2017-12-05 2017-12-05
    1 2017-12-14 2017-12-14
    2 2017-12-15 2017-12-15
    3 2017-12-18 2017-12-18
    3 2017-12-21 2017-12-21
    4 2017-12-22 2017-12-22
    

    【讨论】:

    • 如果日期格式是可预测的,那么也可以使用lookbehind和str.split:x.str.split('(?<=\d{4})\s')
    • @W-B- 太棒了!惊人的。节省了我的时间。
    猜你喜欢
    • 2020-05-10
    • 2020-12-31
    • 2021-03-27
    • 1970-01-01
    • 2016-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    相关资源
    最近更新 更多