我认为没有一种方法可以在一次矢量化操作中做到这一点。然而,您可以做的是将数据帧分割成几个块——每个块都有自己的数据范围格式。对于每个切片,您可以以矢量化方式计算开始日期和结束日期。由于日期格式的数字是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