【问题标题】:Splitting datetime value out of text string with uneven length从长度不均匀的文本字符串中拆分日期时间值
【发布时间】:2020-08-24 13:01:10
【问题描述】:

系统: WIN10

IDE: MS Visual Studio 代码

语言: Python 3.7.3 版

库:熊猫版本 1.0.1

数据来源:在以下示例中提供

数据集:在下面的示例中提供

问:

我需要将日期和时间字符串从具有不均匀分隔符行的数据框中拆分出来,即一些带有三个逗号,一些带有四个逗号。

我试图弄清楚如何去除日期和时间值:'Nov 11 2013 12:00AM' 和 'Apr 11 2013 12:00AM' 分别从一列中这两条记录的后面移到一个新列中,如下例中的第二行逗号更少。

代码:

df['sample field'].head(2) 

4457-I need, this, date, Nov 11 2013 12:00AM ,
2359-I need this, date, Apr 11 2013 12:00AM ,  

虽然下面的方法将数据扩展到不同的列并错开哪一列包含日期,但这不起作用。我需要在一列中包含日期和时间(甚至只是日期)信息,以便我可以在进一步分析中使用日期值(例如时间序列)。

代码:

df['sample field'].str.split(",", expand=True)

【问题讨论】:

    标签: python-3.x pandas timestamp time-series code-splitting


    【解决方案1】:

    我将使用@wwnde 的数据:

    df=pd.DataFrame({'Text':['4457-I need, this, date, Nov 11 2013 12:00AM ,','2359-I need this, date, Apr 11 2013 12:00AM ,']})
    
    df['Date'] = df.Text.str.strip(',').str.split(',').str[-1].str.strip()
    df['Date_formatted'] = pd.to_datetime(df.Date, format = '%b %d %Y %H:%M%p')
    
                   Text                                     Date              Date_formatted
    0   4457-I need, this, date, Nov 11 2013 12:00AM ,  Nov 11 2013 12:00AM 2013-11-11 12:00:00
    1   2359-I need this, date, Apr 11 2013 12:00AM ,   Apr 11 2013 12:00AM 2013-04-11 12:00:00
    

    【讨论】:

    • 感谢您返回此方法也检查了。谢谢!
    【解决方案2】:

    数据

    df=pd.DataFrame({'Text':['4457-I need, this, date, Nov 11 2013 12:00AM ,','2359-I need this, date, Apr 11 2013 12:00AM ,']})
    df
    

    使用带有正则表达式的 df.extract

    df['Date']= df.Text.str.extract('([A-Za-z]+\s+\d+\s+\d+\s+\d+:[0-9A-Z]+(?=\s+\,+))')
    df
    
    
    
     #df.Date=pd.to_datetime(df.Date).dt.strftime('%b %d %Y %H:%M%p')
    #df['date']  = pd.to_datetime(df['date'] ,format='%b %d %Y %H:%M%p')
        df['Date']=pd.to_datetime(df['Date'])#This or even df['Date']=pd.to_datetime(df['Date'], format=('%b %d %Y %I:%M%p')) could work. Just remmeber because your time is 12AM use 12 clock hour system %I not %H and also hour 00.00 likely to be trncated, If have say11.00AM, the time will appear
    

    【讨论】:

    • 您能否检查一下您的这段代码:使用 .info() 表示 dtype。该解决方案有效,我想将其标记为良好,但这部分将 dtype 转换回字符串:#.dt.strftime('%b %d %Y %H:%M%p')。我认为不需要。
    • 好朋友!这作为替代品非常有效。我承认我需要阅读正则表达式文档以更熟悉它。干得好,谢谢。
    【解决方案3】:

    IIUC 你需要带有正则表达式的str.extract

    Regex Demo Here

    print(df)
    
                                                  0
    0  4457-I need, this, date, Nov 11 2013 12:00AM
    1  2359-I need this, date, Apr 11 2013 12:00AM 
    
    df['date'] = df[0].str.extract('(\w{3}\s\d.*\d{4}\s\d{2}:\d{2}\w{2})')
    
    df['date']  = pd.to_datetime(df['date'] ,format='%b %d %Y %H:%M%p')
    

    print(df)
    
                                                  0                date
    0  4457-I need, this, date, Nov 11 2013 12:00AM 2013-11-11 12:00:00
    1  2359-I need this, date, Apr 11 2013 12:00AM  2013-04-11 12:00:00
    

    【讨论】:

    • 此方法似乎部分有效,但仅适用于日期只有一个数字的记录,即 > 这个:4457-我需要,这个,日期,2013 年 11 月 11 日上午 12:00,> 这个:2359-我需要这个,日期,2013 年 4 月 11 日上午 12:00,但不是这些:> 这个:4457-我需要,这个,日期,2013 年 11 月 1 日上午 12:00,> 这个:2359-我需要这个,日期,2013 年 4 月 1 日上午 12:00,
    • @AlfredHull 我刚刚将它们粘贴到上面的正则表达式演示中,它起作用了,我使用 \d.* 占了 1 位数字
    • 我刚刚在 VS CODE 中重新编写了代码,并且出于某种原因,列表中的行项目仍然显示为串联。我尝试了 IIUC 的示例,它解决了单整数和双整数日期问题。
    • 我的意思是 WWNDE 上面的帖子。
    猜你喜欢
    • 2019-02-17
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    • 1970-01-01
    相关资源
    最近更新 更多