【问题标题】:Pandas read_csv converting string to datetime and saving to database PythonPandas read_csv 将字符串转换为日期时间并保存到数据库 Python
【发布时间】:2018-09-08 07:13:27
【问题描述】:

我目前正在使用 pandas 读取 csv 文件。我希望将具有类似于 datetime 的字符串的列转换为 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 subscriptabledate_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。

【问题讨论】:

    标签: python pandas datetime dataframe sqlalchemy


    【解决方案1】:

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

    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'])
    

    【讨论】:

    • 感谢您的回复。我做了你建议的改变,我现在面临一个新的错误,所以我认为这是进步。新错误是:“NoneType”对象不可下标
    • 你试过df['Time UTC'] = pd.to_datetime(df['Time UTC'])吗?您能否提供有关该错误究竟发生在何处的更多信息? (ex.)
    • 我用代码更新和我得到它的错误更新了原始帖子。但是,在实施您的建议后:` df = pd.read_csv(filename, error_bad_lines=False, warn_bad_lines=False) # 更改数据类型 df['Time UTC'] = pd.to_datetime(df['Time UTC'])`去工作!我得到了下一个错误(我认为与此无关):) 谢谢@Arnaud。我会投票,但我还没有足够的代表。
    • 如果可行,那就完美了——我认为这确实是一种更清洁的方式。你仍然可以接受我的回答!谢谢
    猜你喜欢
    • 2016-05-06
    • 2015-03-24
    • 2014-12-18
    • 1970-01-01
    • 2018-05-25
    • 2022-07-04
    • 2021-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多