如何提取Pandas DataFrame中名称为日期格式的列?
提取Pandas DataFrame中名称为日期格式的列
问题场景
给定如下DataFrame,需要提取名称为日期格式的列:
import pandas as pd df = pd.DataFrame([["USD", 12.3, 1, 23.33, 33.1],["USD", 32.1, 2, 34.44, 23.1]],columns= ['currency', '1999-07-31', 'amount', '1999-10-31', '2000-01-31'])
对应的表格:
| currency | 1999-07-31 | amount | 1999-10-31 | 2000-01-31 |
|---|---|---|---|---|
| USD | 12.3 | 1 | 23.33 | 33.1 |
| USD | 32.1 | 2 | 34.44 | 23.1 |
原代码尝试通过select_dtypes筛选日期类型列,但得到空结果:
datetime_types = ["datetime", "datetime64", "datetime64[ns]", "datetimetz"] dates = df.columns.to_frame().select_dtypes(include=datetime_types) # 输出:Empty DataFrame\nColumns: []\nIndex: [currency, 1999-07-31, amount, 1999-10-31, 2000-01-31]
期望输出:['1999-07-31', '1999-10-31', '2000-01-31']
问题原因
原代码逻辑错误:df.columns的数据类型是object(所有列名都是字符串),select_dtypes是用来筛选列中数据的类型,而非列名的内容或格式,因此无法匹配到名称为日期格式的列。
解决方案
方法1:利用Pandas日期解析功能
通过pd.to_datetime尝试解析每个列名,过滤掉无法解析为日期的列:
import pandas as pd df = pd.DataFrame([["USD", 12.3, 1, 23.33, 33.1],["USD", 32.1, 2, 34.44, 23.1]],columns= ['currency', '1999-07-31', 'amount', '1999-10-31', '2000-01-31']) date_cols = [col for col in df.columns if pd.to_datetime(col, errors='coerce') is not pd.NaT] print(date_cols) # 输出:['1999-07-31', '1999-10-31', '2000-01-31']
- 优点:自动兼容多种合法日期格式(如
YYYY/MM/DD) - 缺点:可能误判部分类似日期的字符串(如无效日期会被过滤,但部分合法非日期字符串可能被误解析)
方法2:正则表达式精准匹配
如果日期格式固定为YYYY-MM-DD,可以用正则表达式严格匹配:
import pandas as pd import re df = pd.DataFrame([["USD", 12.3, 1, 23.33, 33.1],["USD", 32.1, 2, 34.44, 23.1]],columns= ['currency', '1999-07-31', 'amount', '1999-10-31', '2000-01-31']) date_pattern = re.compile(r'^\d{4}-\d{2}-\d{2}$') date_cols = [col for col in df.columns if date_pattern.match(col)] print(date_cols) # 输出:['1999-07-31', '1999-10-31', '2000-01-31']
- 优点:精准匹配指定格式,避免误判
- 缺点:仅支持预设的日期格式,无法兼容其他格式
内容的提问来源于stack exchange,提问作者Gооd_Mаn
相关产品推荐
相关产品推荐

