如果该列中的任何值与正则表达式模式(\ d {4}-\ d {2}-\ d {2})+(例如2019-01-01)相匹配,则此函数会将列的数据类型设置为datetime。 )。这个答案归功于如何在所有Pandas DataFrame列中搜索字符串以及如何帮助设置和应用遮罩的过滤器。
def presume_date(dataframe):
""" Set datetime by presuming any date values in the column
indicates that the column data type should be datetime.
Args:
dataframe: Pandas dataframe.
Returns:
Pandas dataframe.
Raises:
None
"""
df = dataframe.copy()
mask = dataframe.astype(str).apply(lambda x: x.str.match(
r'(\d{4}-\d{2}-\d{2})+').any())
df_dates = df.loc[:, mask].apply(pd.to_datetime, errors='coerce')
for col in df_dates.columns:
df[col] = df_dates[col]
return df
从建议使用到使用dateutil
,这可能会有所帮助。仍然在假设列中是否存在任何类似日期的值,该列应为日期时间。我试图考虑更快的其他数据框迭代方法。我认为有关如何迭代Pandas中DataFrame中的行的答案很好地描述了它们。
请注意,dateutil.parser
对于任何没有年份或日期值的字符串,例如``十二月''或``2019年11月'' ,它将使用当前日期或年份。
import pandas as pd
import datetime
from dateutil.parser import parse
df = pd.DataFrame(columns=['are_you_a_date','no_dates_here'])
df = df.append(pd.Series({'are_you_a_date':'December 2015','no_dates_here':'just a string'}), ignore_index=True)
df = df.append(pd.Series({'are_you_a_date':'February 27 2018','no_dates_here':'just a string'}), ignore_index=True)
df = df.append(pd.Series({'are_you_a_date':'May 2017 12','no_dates_here':'just a string'}), ignore_index=True)
df = df.append(pd.Series({'are_you_a_date':'2017-05-21','no_dates_here':'just a string'}), ignore_index=True)
df = df.append(pd.Series({'are_you_a_date':None,'no_dates_here':'just a string'}), ignore_index=True)
df = df.append(pd.Series({'are_you_a_date':'some_string','no_dates_here':'just a string'}), ignore_index=True)
df = df.append(pd.Series({'are_you_a_date':'Processed: 2019/01/25','no_dates_here':'just a string'}), ignore_index=True)
df = df.append(pd.Series({'are_you_a_date':'December','no_dates_here':'just a string'}), ignore_index=True)
def parse_dates(x):
try:
return parse(x,fuzzy=True)
except ValueError:
return ''
except TypeError:
return ''
list_of_datetime_columns = []
for row in df:
if any([isinstance(parse_dates(row[0]),
datetime.datetime) for row in df[[row]].values]):
list_of_datetime_columns.append(row)
df_dates = df.loc[:, list_of_datetime_columns].apply(pd.to_datetime, errors='coerce')
for col in list_of_datetime_columns:
df[col] = df_dates[col]
如果您还想使用中的datatime值dateutil.parser
,则可以添加以下内容:
for col in list_of_datetime_columns:
df[col] = df[col].apply(lambda x: parse_dates(x))
datetime.datetime
或pandas._libs.tslibs.timestamps.Timestamp
?如果是前者,我的建议是将创建日期时间的任何内容更改为pandas
处理起来更好的类型。