Python从字符串中删除特定的零

时间:2016-12-03 05:59:12

标签: python regex string python-3.x pandas

我有一个csv,我将其加载到pandas数据帧中。

我想更改特定列以从月份和日期丢失前导零,并将小时分成另一列。

例如,我有一个名为 DateTime 的列,如“03/17 04:00:00”或“01/01 15:00:00”,我想改变列(也是我想连接2010到日期结束)到“Date”列“3/17/2010”和“Time”列“4:00:00”或类似第二个例子,带有“1/1/2010”的“日期”栏和带有“15:00:00”的“时间”栏。

我很确定我想用regex_replace做这件事,我觉得这最简单吗?

2 个答案:

答案 0 :(得分:1)

请注意,这假设您的数据格式相同:

df = pd.DataFrame({'DateTime': ["03/17 04:00:00", "01/01 15:00:00"]})

dates = []
times = []

for x in df.DateTime:
    d, t = x.split()
    d = re.sub("^0", "", d)
    d += "/2010"
    dates.append(d)
    times.append(t)

df['Date'] = dates
df['Time'] = times

答案 1 :(得分:1)

您可以str.split使用str.lstrip

df[['Date', 'Time']] = df.DateTime.str.split(expand=True)
df.Date = df.Date.str.lstrip('0') + '/2010'
print (df)
         DateTime       Date      Time
0  03/17 04:00:00  3/17/2010  04:00:00
1  01/01 15:00:00  1/01/2010  15:00:00

正则表达式^0 str.replace的类似解决方案(字符串中的第一个0):

df[['Date', 'Time']] = df.DateTime.str.split(expand=True)
df.Date = df.Date.str.replace('^0', '') + '/2010'

<强>计时

In [10]: %timeit (jez(df2))
1 loop, best of 3: 483 ms per loop

In [11]: %timeit (jez(df))
1 loop, best of 3: 500 ms per loop

In [12]: %timeit (user39(df1))
1 loop, best of 3: 740 ms per loop

时间安排的代码

df = pd.DataFrame({'DateTime': ["03/17 04:00:00", "01/01 15:00:00"]})
df = pd.concat([df]*100000).reset_index(drop=True)
#[200000 rows x 3 columns]
print (df)
df1 = df.copy()
df2 = df.copy()

def jez(df):
    df[['Date', 'Time']] = df.DateTime.str.split(expand=True)
    df.Date = df.Date.str.lstrip('0') + '/2010'
    return (df)

def jez1(df):
    df[['Date', 'Time']] = df.DateTime.str.split(expand=True)
    df.Date = df.Date.str.replace('^0', '') + '/2010'
    return (df)    

def user39(df):
    dates = []
    times = []

    for x in df.DateTime:
        d, t = x.split()
        d = re.sub("^0", "", d)
        d += "/2010"
        dates.append(d)
        times.append(t)

    df['Date'] = dates
    df['Time'] = times
    return df

print (jez(df))
print (jez(df2))
print (user39(df1))