使用Pandas读取csv文件有没有办法自动检测dd-mm-yyyy vs mm-dd-yyyy格式?

时间:2017-06-16 08:58:08

标签: python csv date pandas datetime

我正在读入数据帧的csv文件中的日期数据格式为dd-mm-yyyy

12-02-2017 23:37:45
12-02-2017 23:52:17
13-02-2017 00:02:28

使用以下代码读取csv文件:

data = pd.read_csv(filename, header=header, engine='c', error_bad_lines=False)

数据框包含格式为

的日期
2017-12-02T23:37:45
2017-12-02T23:52:17
2017-02-13T00:02:28

即熊猫似乎假设输入是mm-dd-yyyy,直到一个月不适合然后翻转到dd-mm-yyyy假设。

我也尝试过:

date_parser = pd.datetools.to_datetime
data = pd.read_csv(filename, header=header, parse_dates=True, infer_datetime_format=True, date_parser=date_parser, engine='c', error_bad_lines=False)

结果相同。

问题是用户可以使用mm-dd-yyyy或dd-mm-yyyy格式上传数据。

我可以在文本文件中读取并运行一些手动Python字符串检查,但有没有办法用Pandas自动执行此操作?

1 个答案:

答案 0 :(得分:0)

执行此操作的一种方法是读取csv文件,使用dateutil使用默认的dayfirst = True解析日期。

请注意,我在用户输入屏幕上添加了一个单选框,以确定日期是日期还是月份。

通过在pd.read_csv()中设置dayfirst = True可以实现类似,但是我使用索引列作为日期列时出现了pandas问题。

日期从csv读取并使用:

转换
def extract_clean_dates_from_csv(self, file_path, contains_header, date_col, day_first):
    with open(file_path, "r") as f:
        reader = csv.reader(f)
        reader_list = list(reader)
    parsed_dates = self.convert_dates(reader_list, contains_header, date_col, day_first)
    return parsed_dates

def convert_dates(self, reader_list, contains_header, date_col, day_first):
    parsed_dates = []
    headline = True
    for row in reader_list:
        if (headline and contains_header):
            headline = False
            continue
        parsed_date = parse(row[date_col], dayfirst=day_first)
        parsed_dates.append(parsed_date)
    return parsed_dates

然后我只用新解​​析的日期替换了数据框原始日期列:

df.iloc[:, date_col] = parsed_dates