Pandas read_csv将字符串转换为datetime并保存到数据库Python

时间:2018-03-29 10:51:51

标签: python pandas datetime dataframe sqlalchemy

我目前正在阅读带有pandas的csv文件。我希望将具有类似日期时间的字符串的列转换为DateTime对象。我对我的数据库有限制,指定该列应该是这种类型。

我的csv文件中的一个示例行是:

2015-11-28 00:10:00, 99, 21

当我有以下内容时,我原本面临这个问题。

    # import CSV file
    df = pd.read_csv(filename, error_bad_lines=False, warn_bad_lines=False)

    # TODO  Save data into db
    # ADD time, banana, apple
    for i in df.index:
        m = AggregatedMeasurement(
            time=df.loc[i, 'Time UTC'],
            banana=df.loc[i, 'BANANA'],
            apple=df.loc[i, 'APPLE']
        )
        db.session.add(m)  # add to db
    db.session.commit()  # perform them all

我收到以下错误。

StatementError: (builtins.TypeError) SQLite DateTime type only accepts Python datetime and date objects as input

我开始在这里搜索,发现可以指示 date_parser 并启动组合。到目前为止,这是我在这个建议的帮助下尝试过的。 Can pandas automatically recognize dates

    dateparse = lambda x: pd.datetime.strptime(x, '%Y-%m-%d %H:%M:%S')

    # import CSV file
    df = pd.read_csv(filename, error_bad_lines=False, warn_bad_lines=False, parse_dates=['datetime'],
                     date_parser=dateparse)

现在我收到以下错误

ValueError: 'datetime' is not in list

我是否实施了这个错误?提前谢谢!

更新1

经过以下更改

dateparse = lambda x: pd.datetime.strptime(x, '%Y-%m-%d %H:%M:%S')

# import CSV file
    df = pd.read_csv(filename, error_bad_lines=False,
                      warn_bad_lines=False,
                      parse_dates=['Time UTC'],
                      date_parser=dateparse)

我在此特定部分TypeError: 'NoneType' object is not subscriptable

上获得了date_parser=dateparse)

更新2 后来,我尝试了下一个建议。

    df = pd.read_csv(filename, error_bad_lines=False,
                     warn_bad_lines=False)

    # Changing datatype
    df['Time UTC'] = pd.to_datetime(df['Time UTC'])

而且我认为这有效:)我得到了另一个错误,但这对应于我尚未设置的另一个数据库限制关系/ ForeignKey。

1 个答案:

答案 0 :(得分:0)

可能是一个简单的错误。我认为你应该这样做:

df = pd.read_csv(filename, 
                 error_bad_lines=False, 
                 warn_bad_lines=False, 
                 parse_dates=['Time UTC'],
                 date_parser=dateparse)

确实,您应该将parse_dates引用到感兴趣的列'Time UTC',而不是'datetime'

否则,您可以更轻松地让pd.to_datetime()使用:

来处理任务
df = pd.read_csv(filename, error_bad_lines=False,
                     warn_bad_lines=False)

# Changing datatype
df['Time UTC'] = pd.to_datetime(df['Time UTC'])