无法让.replace()正常运行

时间:2018-01-29 17:43:58

标签: pandas dataframe

嗨,谁在读这个!我试图使用df['ride_duration'] = df['ride_duration'].replace(r'^\s+$',"00:00:00", regex=True)从下面附带的屏幕截图中删除空格/空格。事情是,由于某种原因,这是行不通的,即使这是我在Stack Overflow上看到的。我也尝试过:df['ride_duration'] = df['ride_duration'].replace("","00:00:00)遗憾的是,结果根本不会改变列。有人可以指出我为什么这不起作用的正确方向?

示例代码:

fmtymd = '%Y/%m/%d'
 df = pd.read_csv(csvfilelocation, sep=',')
 df['scheduled departure time'] =  pd.to_datetime(df['scheduled departure time'], format = fmtymd)
 df['epoch_arrival'] = pd.to_datetime(df['epoch_arrival'], format = fmtymd)
 df['latetime'] = (df['epoch_arrival'] - df['scheduled departure time']).where(df['OTP'] == False)
 df['latetime'] = df['latetime'].replace("","00:00:00")
 df['latetime'] = pd.to_timedelta(df['latetime'])
 df['latetime'] = (df['latetime'] / np.timedelta64(1, 'm')).astype(int)
 df.to_csv(csvfilelocation, index=False, float_format='%.0f')

CSV示例:https://ufile.io/qtkxb

2 个答案:

答案 0 :(得分:2)

您可能需要阅读正则表达式教程。

这个正则表达式正在寻找一个或多个空白字符,就是这样。

library(pryr)
x <- 1:10
pryr::address(x)
x[3] <- 7L
pryr::address(x)

由于您现在已经评论过这是一个timedelta列,我们需要使用一些字符串格式。请参阅下面的更新解决方案。

df['ride_duration'].replace(r'^\s+$',"00:00:00", regex=True)

然后将其恢复到时间范围,你可以做到:

df['ride_duration'].astype(str).replace(r"\s+","",regex=True)

答案 1 :(得分:1)

我为你做了一个例子。我有以下数据集:

Date, Name
, John
26.05.16, David
27.05.16, Rose
, Yolo
29.05.16, Marie
30.05.16, Mark

这是我的代码分3步:

import pandas as pd

# Date format
fmtymd = '%d.%m.%y'

# Load csv file
df = pd.read_csv('./sample-data.csv', sep=',')

print(df)

结果:

       Date    Name
0       NaN    John
1  26.05.16   David
2  27.05.16    Rose
3       NaN    Yolo
4  29.05.16   Marie
5  30.05.16    Mark

现在我想将日期格式设置为Date:

df['Date'] =  pd.to_datetime(df['Date'], format = fmtymd)
print(df)

结果:

        Date    Name
0        NaT    John
1 2016-05-26   David
2 2016-05-27    Rose
3        NaT    Yolo
4 2016-05-29   Marie
5 2016-05-30    Mark

这是重要的一步。如您所见,空字符串将转换为“NaT”(非时间戳)。这就是为什么你可以用“00:00:00”替换“”的原因

现在我想用“00:00:00”替换NaT:

df['Date'] = [d.strftime('%Y-%m-%d') if not pd.isnull(d) else '00:00:00' for d in df['Date']]

print(df)

结果:

         Date    Name
0    00:00:00    John
1  2016-05-26   David
2  2016-05-27    Rose
3    00:00:00    Yolo
4  2016-05-29   Marie
5  2016-05-30    Mark

这只是一个例子,我知道日期格式不同(对于列日期)。您需要为新列设置相同的dateformat。

完整代码:

import pandas as pd

fmtymd = '%d.%m.%y'
df = pd.read_csv('./sample-data.csv', sep=',')

print(df)

df['Date'] =  pd.to_datetime(df['Date'], format = fmtymd)
print(df)

df['Date'] = [d.strftime('%Y-%m-%d') if not pd.isnull(d) else '00:00:00' for d in df['Date']]

print(df)