替换列中满足特定条件的前两个字符

时间:2017-08-07 03:48:25

标签: python replace

我正在考虑将以下数据从Month_Day转换为tmaxmin到' Jan-01',' Feb-15'等...

Month_Day max min

0 01-01 243 86

1 01-02 230 90

2 01-03 233 104

3 01-04 220 73

4 01-05 224 71

虽然我知道做这样的替换是愚蠢的,我可以知道是否有更快的方法这样做?

for i in range(len(tmaxmin)):
    if tmaxmin['Month_Day'][i][:2] == '01':
        tmaxmin['Month_Day'][i] = 'Jan-'+tmaxmin['Month_Day'][i][3:5]
    if tmaxmin['Month_Day'][i][:2] == '02':
        tmaxmin['Month_Day'][i] = 'Feb-'+tmaxmin['Month_Day'][i][3:5]
    if tmaxmin['Month_Day'][i][:2] == '03':
        tmaxmin['Month_Day'][i] = 'Mar-'+tmaxmin['Month_Day'][i][3:5]
    if tmaxmin['Month_Day'][i][:2] == '04':
        tmaxmin['Month_Day'][i] = 'Apr-'+tmaxmin['Month_Day'][i][3:5]
    if tmaxmin['Month_Day'][i][:2] == '05':
        tmaxmin['Month_Day'][i] = 'May-'+tmaxmin['Month_Day'][i][3:5]
    if tmaxmin['Month_Day'][i][:2] == '06':
        tmaxmin['Month_Day'][i] = 'Jun-'+tmaxmin['Month_Day'][i][3:5]
    if tmaxmin['Month_Day'][i][:2] == '07':
        tmaxmin['Month_Day'][i] = 'Jul-'+tmaxmin['Month_Day'][i][3:5]
    if tmaxmin['Month_Day'][i][:2] == '08':
        tmaxmin['Month_Day'][i] = 'Aug-'+tmaxmin['Month_Day'][i][3:5]
    if tmaxmin['Month_Day'][i][:2] == '09':
        tmaxmin['Month_Day'][i] = 'Sep-'+tmaxmin['Month_Day'][i][3:5]
    if tmaxmin['Month_Day'][i][:2] == '10':
        tmaxmin['Month_Day'][i] = 'Oct-'+tmaxmin['Month_Day'][i][3:5]
    if tmaxmin['Month_Day'][i][:2] == '11':
        tmaxmin['Month_Day'][i] = 'Nov-'+tmaxmin['Month_Day'][i][3:5]
    if tmaxmin['Month_Day'][i][:2] == '12':
        tmaxmin['Month_Day'][i] = 'Dec-'+tmaxmin['Month_Day'][i][3:5]

4 个答案:

答案 0 :(得分:0)

使用pandas.to_datetimepandas.Series.dt.strftime(以及https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior作为参考)对您有利!

Month_Day_dt = pandas.to_datetime(tmaxmin['Month_Day'], format = '%m-%d')
tmaxmin['Month_Day'] = Month_Day_dt.dt.strftime('%b-%d')

答案 1 :(得分:0)

from datetime import datetime
for i in range(len(tmaxmin)):
    dt = datetime.strptime(tmaxmin['Month_Day'][i][2:7], '%m-%d')
    tmaxmin['Month_Day'][i] = dt.strftime('%b-%d')

答案 2 :(得分:0)

由于您的Month_Day密钥似乎链接到str,因此您不需要使用切片表示法,但最好使用str类型方法而是startswith

所以:

if tmaxmin['Month_Day'][i].startswith('01'):
    # do your stuff

这是清理代码的开始。

此外,tmaxmin是可迭代的,因此您只需使用for ... in ...:来迭代它:

for date in tmaxmin:
    if date['Month_Day'].startswith('01'):
        date['Month_Day'] = "something else"

由于列表和dicts是可变的,因此这将编辑列表。

此外,您可能想要创建一个元组以将替换组合在一起,这样您就可以拥有更清晰的代码:

replacements = (
    ('01', 'Jan'),
    ('02', 'Feb'),
    ('03', 'March'),
    ...
    )

for date in tmaxmin:
    for old, new in replacements:
        if date.startswith(old):
            date['Month_Day'] = new + date['Month_Day'][2:]

答案 3 :(得分:0)

假设tmaxmin是:

  Month_Day  max  min
0     01-01  243   86
1     01-02  230   90
2     01-03  233  104
3     01-04  220   73
4     01-05  224   71

使用calendarapply

import calendar
tmaxmin.Month_Day = tmaxmin.Month_Day.apply(lambda x:calendar.month_abbr[int(x[:2])]+x[2:])

你会得到

  Month_Day  max  min
0    Jan-01  243   86
1    Jan-02  230   90
2    Jan-03  233  104
3    Jan-04  220   73
4    Jan-05  224   71