如何使用 python pandas 清理多种格式的日期范围?

2024-01-28

我有一个数据框,其中包含一些混合格式的日期,如下所示:

import pandas as pd

dates = ['Dec-03',
         '03/11/2003 - 05/04/2004',
         'Apr-04',
         '2004 - 2005',
         '01/02/2005 - 31/03/2005']

df = pd.DataFrame(dates, columns = ["date_range"])

日期可以采用三种格式,如上例所示:两年;一个月;两个约会在一起。

我希望找到一种有效且“Pythonic”的方法来在数据框中创建“开始日期”和“结束日期”列,结果如下:

    date_range                         start_dates  end_dates
0   Dec-03                             01/12/2003   31/12/2003
1   03/11/2003 - 05/04/2004            03/11/2003   05/04/2004
2   Apr-04                             01/04/2004   30/04/2004
3   2004 - 2005                        01/01/2004   31/12/2005
4   01/02/2005 - 31/03/2005            01/02/2005   31/03/2005

我尝试过涉及 df.iterrows 和一些 if 语句的解决方案,但我想知道是否有更有效的方法来解决这个问题。完整的数据集包含数百万行,因此使用矢量化函数或类似函数的东西可以很好地工作。


我认为没有一种方法可以在一次矢量化操作中做到这一点。然而,您可以做的是将数据帧分割成几个块——每个块都有自己的数据范围格式。对于每个切片,您可以以矢量化方式计算开始日期和结束日期。由于日期格式的数字是much比记录数小,应该很快。

这是一个实现:

from pandas.tseries.offsets import MonthEnd, YearEnd

df["start_time"] = pd.NaT
df["end_time"] = pd.NaT

mask = df.date_range.str.match(r"\w{3}-\d{2}")
df.loc[mask, "start_time"] = pd.to_datetime(df.loc[mask, "date_range"], format = "%b-%y")
df.loc[mask, "end_time"] = df.loc[mask, "start_time"] + MonthEnd(1)

mask = df.date_range.str.match(r"\d{4}\s*-\s*\d{4}")
df.loc[mask, "start_time"] = pd.to_datetime(df.loc[mask, "date_range"].str.split("-", expand=True)[0].str.strip(), 
                                            format="%Y")
df.loc[mask, "end_time"] = pd.to_datetime(df.loc[mask, "date_range"].str.split("-", expand=True)[1].str.strip(), 
                                            format="%Y") + YearEnd(1) 


mask = df.date_range.str.match(r"\d{2}/\d{2}/\d{4} - \d{2}/\d{2}/\d{4}")

df.loc[mask, "start_time"] = pd.to_datetime(df.loc[mask, "date_range"].str.split("-", expand=True)[0].str.strip(), 
                                            format="%d/%m/%Y")

df.loc[mask, "end_time"] = pd.to_datetime(df.loc[mask, "date_range"].str.split("-", expand=True)[1].str.strip(), 
                                            format="%d/%m/%Y")

结果是:

                date_range start_time   end_time
0                   Dec-03 2003-12-01 2003-12-31
1  03/11/2003 - 05/04/2004 2003-11-03 2004-04-05
2                   Apr-04 2004-04-01 2004-04-30
3              2004 - 2005 2004-01-01 2005-12-31
4  01/02/2005 - 31/03/2005 2005-02-01 2005-03-31
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 python pandas 清理多种格式的日期范围? 的相关文章

随机推荐