【问题标题】:Python remove specific zeros from stringPython从字符串中删除特定的零
【发布时间】:2017-04-18 02:31:49
【问题描述】:

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

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

例如,我有一个名为 DateTime 的列,如“03/17 04:00:00”或“01/01 15:00:00”,我想更改该列(而且我猜想将 2010 年连接到日期的末尾)到一个带有“3/17/2010”的“日期”列和一个带有“4:00:00”的“时间”列,或者像第二个例子,一个带有“1/1/2010”的“日期”列和一个带有“15:00:00”的“时间”列。

我很确定我想用 regex_replace 来做这件事,我认为那会是最简单的吗?

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

    • 熊猫中的循环显然很慢,最好避免它。
    • 您的回答很好地证明了这一点。我还在学习熊猫,所以我把它分解成一个循环。希望答案的技能范围对人们有所帮助。
    【解决方案2】:

    您可以将str.splitstr.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
    

    通过正则表达式^0str.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))
    

    【讨论】:

      【解决方案3】:

      datetime 模块拥有您所需要的 strptime。您应该将正则表达式保存为最后的手段,因为它的可读性较差且更容易出错。

      classmethod datetime.strptime(date_string, format)

      返回一个对应date_stringdatetime,根据格式解析。这相当于datetime(*(time.strptime(date_string, format)[0:6]))。如果 time.strptime() 无法解析 date_stringformat 或者如果它返回的值不是时间元组,则会引发 ValueError。有关格式化指令的完整列表,请参阅strftime() and strptime() Behavior

      文档包含指令,但这里是您可以在代码中实现的示例:

      import datetime
      
      
      def convert_time(tm):
          dt = datetime.datetime.strptime(tm, "%m/%d %H:%M:%S")
          dt.year = 2010
      
          parsed_date = "{month}/{day}/{year}".format(*dt)
          parsed_time = "{hour}:{minute}:{second}".format(*dt)
      
          return parsed_date, parsed_time
      

      【讨论】:

        猜你喜欢
        • 2011-04-25
        • 2013-10-31
        • 1970-01-01
        • 1970-01-01
        • 2018-09-16
        • 1970-01-01
        • 2015-10-02
        • 2020-06-06
        相关资源
        最近更新 更多