繁体   English   中英

根据日期格式过滤 pandas dataframe

[英]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+')] (即数据帧的子集)不能直接转换为TrueFalse

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM