[英]Filter pandas dataframe based on date format
我有 dataframe 它有两种日期格式:
Date Sales
Mar-81 1020.2
Jun-81 889.2
Sep-81 795.0
Dec-81 1003.9
Mar-82 1057.7
这种格式一直持续到 12 月 00 日。 随着年份从 2000 年过渡到 2001 年,格式变化如下:
Date Sales
1-Mar 1014.2
1-Jun 952.6
1-Sep 792.4
1-Dec 922.3
2-Mar 1055.9
这应该是 2001 年 3 月、2001 年 6 月等。
我正在尝试根据这种格式过滤这些数据并将相应的行转换为日期时间格式:
if df[df['Date'].str.endswith('\d+')]: #endswith digits
df['Date'] = pd.to_datetime(df['Date'], format='%b-%y')
else:
df['Date'] = df['Date'].apply(lambda x: x.zfill(6))
df['Date'] = pd.to_datetime(df['Date'], format='%y-%b')
运行此程序时出现以下错误: DataFrame 的真值不明确。 使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。
不知道我在这里做错了什么。
一种使用pandas.to_datetime
errors
的方法:
s = df["Date"]
s2 = pd.to_datetime(s, format='%b-%y', errors="coerce")
s2.fillna(pd.to_datetime(s.str.zfill(6), format='%y-%b', errors="coerce"))
Output:
0 1981-03-01
1 1981-06-01
2 1981-09-01
3 1981-12-01
4 1982-03-01
5 2001-03-01
6 2001-06-01
7 2001-09-01
8 2001-12-01
9 2002-03-01
Name: Date, dtype: datetime64[ns]
您的方法不起作用,因为df[df['Date'].str.endswith('\d+')]
(即数据帧的子集)不能直接转换为True
或False
。
if 语句位于具有多个 boolean 值的数据帧上。 这就是错误的意思。
切换顺序。 制作一个适用于单个值的 function 并将其应用于日期。
def to_date(x):
if re.search('\d+$', x) is not None:
return pd.to_datetime(x, format='%b-%y')
else:
return pd.to_datetime(x.zfill(6), format='%y-%b')
df['Date'] = df['Date'].apply(to_date)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.