自动检测日期列**在运行时**



我想知道pandas是否能够自动检测哪些列是datetime对象,并将这些列读取为日期而不是字符串?

我正在看api和相关的堆栈溢出的帖子,但我似乎不能弄清楚。

这是一个黑盒系统,在生产中采用任意csv模式,所以我不知道列名将是什么

这似乎可以工作,但你必须知道哪些列是日期字段:

import pandas as pd
#creating the test data
df = pd.DataFrame({'0': ['a', 'b', 'c'], '1': ['2015-12-27','2015-12-28', '2015-12-29'], '2': [11,12,13]})
df.to_csv('test.csv', index=False)
#loading the test data
df = pd.read_csv('test.csv', parse_dates=True)
print df.dtypes 
# prints (object, object, int64) instead of (object,datetime, int64)

我在想,如果它不能做到这一点,那么我可以写一些东西:

    查找字符串类型的列。
  1. 抓取一些唯一的值并尝试解析它们。
  2. 如果成功,则尝试解析整个列。

编辑。我写了一个简单的方法convertDateColumns,它将做到这一点:

import pandas as pd
from dateutil import parser
def convertDateColumns(self, df):
    object_cols = df.columns.values[df.dtypes.values == 'object']
    date_cols = [c for c in object_cols if testIfColumnIsDate(df[c], num_tries=3)]
    for col in date_cols:
        try:
            df[col] = pd.to_datetime(df[col], coerce=True, infer_datetime_format=True)
        except ValueError:
            pass
    return df
def testIfColumnIsDate(series, num_tries=4):
""" Test if a column contains date values.
    This can try a few times for the scenerio where a date column may have
    a couple of null or missing values but we still want to parse when
    possible (and convert those null/missing to NaD values)
"""
    if series.dtype != 'object':
        return False
    vals = set()
    for val in series:
        vals.add(val)
        if len(vals) > num_tries:
            break
    for val in list(vals):
        try:
            if type(val) is int:
                continue
            parser.parse(val)
            return True
        except ValueError:
            pass
    return False

我将使用pd.to_datetime,并在不工作的列上捕获异常。例如:

import pandas as pd
df = pd.read_csv('test.csv')
for col in df.columns:
    if df[col].dtype == 'object':
        try:
            df[col] = pd.to_datetime(df[col])
        except ValueError:
            pass
df.dtypes
# (object, datetime64[ns], int64)

我相信这是最接近"自动"的,你可以在这个应用程序

您可以通过使用参数errors='ignore'来摆脱for循环,以避免修改不需要的值。在下面的代码中,我们对所有object列应用to_datetime转换(忽略错误)——其他列按原样返回。

如果是ignore,那么无效解析将返回输入

df = df.apply(lambda col: pd.to_datetime(col, errors='ignore') 
              if col.dtypes == object 
              else col, 
              axis=0)
df.dtypes
# 0            object
# 1    datetime64[ns]
# 2             int64

相关内容

  • 没有找到相关文章

最新更新