非捕获组在pandas read_csv中的分隔符中不起作用

时间:2016-02-01 18:21:13

标签: python regex pandas

我有csv文件,其中每一行都是这种格式:

(moon_phase)\t(year) (month) (day) (time)

例如:

new moon\t2011 Jan 04 09:03
first quarter\t2011 Jan 12 11:31

我想用熊猫' read_csv()打开文件并提出如下表:

|moon_phase    |date       |time |
|--------------|-----------|-----|
|new moon      |2011 Jan 04|09:03|
|first quarter |2011 Jan 12|11:31|

然而,当我使用带有值sep的read_csv参数"\t|(?:\d)( )(?:\d)"来分割制表空间中的行(以分隔月相和日期)和使用非捕获的正则表达式时组(分隔日期和时间),结果改为:

|New Moon     |NaN|2011 Jan 0| |9:03|
|First Quarter|NaN|2011 Jan 1| |1:31|

我想使用月份的day和匹配中的hour,但分隔符应仅在分隔日期和时间时引用它们之间的空格。如何在正则表达式中完成?

1 个答案:

答案 0 :(得分:1)

也许您可以在read_csv中使用分隔符\t,然后使用strftime创建新列DateTime

import pandas as pd
import numpy as np
import io

temp=u"""new moon\t2011 Jan 04 09:03
first quarter\t2011 Jan 12 11:31"""
#after testing replace io.StringIO(temp) to filename
df = pd.read_csv(io.StringIO(temp), 
                 sep="\t", 
                 parse_dates=[1], 
                 header=None, 
                 names=['Text', 'Datetime'] )
print df
            Text            Datetime
0       new moon 2011-01-04 09:03:00
1  first quarter 2011-01-12 11:31:00

df['Date'] = df['Datetime'].dt.strftime('%Y %b %d')
df['Time'] = df['Datetime'].dt.strftime('%H:%M')

#if you want drop column Datetime
df = df.drop('Datetime', axis=1)
print df
            Text         Date   Time
0       new moon  2011 Jan 04  09:03
1  first quarter  2011 Jan 12  11:31