使用pandas中的字典将数字替换为数字

时间:2015-01-07 22:23:55

标签: python regex pandas

我试图将数字代表的月份(例如' NOV')替换为数字对应物(' -11 - ')。我可以使用以下代码来正常工作。

df_cohorts['ltouch_datetime'] = df_cohorts['ltouch_datetime'].str.replace('NOV','-11-')
df_cohorts['ltouch_datetime'] = df_cohorts['ltouch_datetime'].str.replace('DEC','-12-')
df_cohorts['ltouch_datetime'] = df_cohorts['ltouch_datetime'].str.replace('JAN','-01-')

但是,为了避免冗余,我想使用字典和.replace来替换所有月份的字符变量。

r_month1 = {'JAN':'-01-','FEB':'-02-','MAR':'-03-','APR':'-04-','MAY':'-05-','JUN':'-06-','JUL':'-07-','AUG':'-08-','SEP':'-09-','OCT':'-10-','NOV':'-11-','DEC':'-12-'}
df_cohorts.replace({'conversion_datetime': r_month1,'ltouch_datetime': r_month1})

当我输入上面的代码时,我的输出数据集保持不变。如需参考,请参阅下面的示例数据。

User_ID    ltouch_datetime     conversion_datetime

001        11NOV14:13:12:56     11NOV14:16:12:00 
002        07NOV14:17:46:14     08NOV14:13:10:00 
003        04DEC14:17:46:14     04DEC15:13:12:00

谢谢!

1 个答案:

答案 0 :(得分:3)

让我建议一个不同的方法:您可以将日期字符串解析为一组pandas TimeStamps,如下所示:

import pandas as pd

df = pd.read_table('data', sep='\s+')
for col in ('ltouch_datetime', 'conversion_datetime'):
    df[col] = pd.to_datetime(df[col], format='%d%b%y:%H:%M:%S')

print(df)

#    User_ID     ltouch_datetime conversion_datetime
# 0        1 2014-11-11 13:12:56 2014-11-11 16:12:00
# 1        2 2014-11-07 17:46:14 2014-11-08 13:10:00
# 2        3 2014-12-04 17:46:14 2015-12-04 13:12:00

我会在这里停下来,因为TimeStamps是理想的日期 Pandas中数据的表格。

但是,如果您需要/希望将'NOV'转换为-11-的3个字母的月份的日期字符串,则可以使用strftimeapply转换时间戳:

for col in ('ltouch_datetime', 'conversion_datetime'):
    df[col] = df[col].apply(lambda x: x.strftime('%d-%m-%y:%H:%M:%S'))

print(df)

产量

   User_ID    ltouch_datetime conversion_datetime
0        1  11-11-14:13:12:56   11-11-14:16:12:00
1        2  07-11-14:17:46:14   08-11-14:13:10:00
2        3  04-12-14:17:46:14   04-12-15:13:12:00

要按字面意思回答您的问题,为了使用Series.str.replace,您需要一个包含月份字符串缩写的列。您可以先致电Series.str.extract来安排。然后,您可以使用apply

将列重新加入一个列
import pandas as pd
import calendar
month_map = {calendar.month_abbr[m].upper():'-{:02d}-'.format(m) 
             for m in range(1,13)}

df = pd.read_table('data', sep='\s+')
for col in ('ltouch_datetime', 'conversion_datetime'):
    tmp = df[col].str.extract(r'(.*?)(\D+)(.*)')
    tmp[1] = tmp[1].replace(month_map)
    df[col] = tmp.apply(''.join, axis=1)

print(df)

产量

   User_ID    ltouch_datetime conversion_datetime
0        1  11-11-14:13:12:56   11-11-14:16:12:00
1        2  07-11-14:17:46:14   08-11-14:13:10:00
2        3  04-12-14:17:46:14   04-12-15:13:12:00

最后,虽然你没有直接询问这个问题,但要注意这一点很好 如果您的数据在文件中,则可以将datestring列解析为 TimeStamps 直接使用

import pandas as pd
import datetime as DT
df = pd.read_table(
    'data', sep='\s+', parse_dates=[1,2],
    date_parser=lambda x: DT.datetime.strptime(x, '%d%b%y:%H:%M:%S'))

这可能是最方便的方法(假设您需要TimeStamps)。