我有一个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做这件事,我觉得这最简单吗?
答案 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))