从长度不均匀的文本字符串中拆分日期时间值

Splitting datetime value out of text string with uneven length

系统:WIN10

IDE: MS Visual Studio COde

语言:Python版本 3.7.3

库: pandas 版本 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)

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

数据

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

我将使用@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