python 时间 空值如何写入数据库

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 时间 空值如何写入数据库相关的知识,希望对你有一定的参考价值。

我要用python向mysql 字段类型为date的列写入0000-00-00的日期
提示错误
(1292, "Incorrect date value: '0000-00-00' for column 'opendate' at row 1")

如果我直接在mysql端执行却可以正常执行 请问怎么可以直接用python写入mysql

参考技术A 1.如果值为None,给个默认值
if not aa:
aa=1

2.没有默认值,就拼sql
if not aa:
sql = 'insert table(bb,cc) values(.....)'
else:
sql = 'insert table(aa,bb,cc) values(.....)'
参考技术B """if thetable (id int, strfield, varchar(32), dtfield datetime)"""
..
conn.executemany("insert into thetable values (?,?,?,?)", [
[100, 'a string field', '2013-12-01'],
[101, 'another record', None],
]
conn.commit()
参考技术C 可以对'0000-00-00' 使用 str_to_date()函数, str_to_date('0000-00-00')追问

我用这个办法程序报这个错误
(1411, "Incorrect datetime value: '0000-00-00' for function str_to_date")

本回答被提问者采纳
参考技术D 看看你php session的sql_mode是什么

如何使用空值将字符串转换为日期时间 - python,pandas?

【中文标题】如何使用空值将字符串转换为日期时间 - python,pandas?【英文标题】:How to convert string to datetime with nulls - python, pandas? 【发布时间】:2015-05-31 15:45:51 【问题描述】:

我有一个包含一些日期时间(作为字符串)和一些空值作为“nan”的系列:

import pandas as pd, numpy as np, datetime as dt
df = pd.DataFrame('Date':['2014-10-20 10:44:31', '2014-10-23 09:33:46', 'nan', '2014-10-01 09:38:45'])

我正在尝试将这些转换为日期时间:

df['Date'] = df['Date'].apply(lambda x: dt.datetime.strptime(x, '%Y-%m-%d %H:%M:%S'))

但我得到了错误:

time data 'nan' does not match format '%Y-%m-%d %H:%M:%S'

所以我试着把这些变成实际的空值:

df.ix[df['Date'] == 'nan', 'Date'] = np.NaN

然后重复:

df['Date'] = df['Date'].apply(lambda x: dt.datetime.strptime(x, '%Y-%m-%d %H:%M:%S'))

然后我得到错误:

必须是字符串,不能是浮点数

解决这个问题的最快方法是什么?

【问题讨论】:

【参考方案1】:

只需使用to_datetime 并设置errors='coerce' 来处理duff 数据:

In [321]:

df['Date'] = pd.to_datetime(df['Date'], errors='coerce')
df
Out[321]:
                 Date
0 2014-10-20 10:44:31
1 2014-10-23 09:33:46
2                 NaT
3 2014-10-01 09:38:45

In [322]:

df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 4 entries, 0 to 3
Data columns (total 1 columns):
Date    3 non-null datetime64[ns]
dtypes: datetime64[ns](1)
memory usage: 64.0 bytes

调用strptime 的问题是如果字符串或dtype 不正确会引发错误。

如果你这样做了,那么它会起作用:

In [324]:

def func(x):
    try:
        return dt.datetime.strptime(x, '%Y-%m-%d %H:%M:%S')
    except:
        return pd.NaT

df['Date'].apply(func)
Out[324]:
0   2014-10-20 10:44:31
1   2014-10-23 09:33:46
2                   NaT
3   2014-10-01 09:38:45
Name: Date, dtype: datetime64[ns]

但使用内置的to_datetime 会更快,而不是调用apply,后者基本上只是循环您的系列。

时间

In [326]:

%timeit pd.to_datetime(df['Date'], errors='coerce')
%timeit df['Date'].apply(func)
10000 loops, best of 3: 65.8 µs per loop
10000 loops, best of 3: 186 µs per loop

我们在这里看到使用to_datetime 的速度提高了 3 倍。

【讨论】:

当前语法现在是errors='coerce',而不是coerce=True【参考方案2】:

我发现让 pandas 在大型数据帧上完成这项工作太慢了。在另一篇文章中,我学到了一种技术,当唯一值的数量远小于行数时,这种技术可以显着加快速度。 (我的数据通常是股票价格或交易记录数据。)它首先构建一个字典,将文本日期映射到它们的日期时间对象,然后应用该字典来转换文本日期列。

def str2time(val):
    try:
        return dt.datetime.strptime(val, '%H:%M:%S.%f')
    except:
        return pd.NaT

def TextTime2Time(s):
    times = t : str2time(t) for t in s.unique()
    return s.apply(lambda v: times[v])

df.date = TextTime2Time(df.date)

【讨论】:

以上是关于python 时间 空值如何写入数据库的主要内容,如果未能解决你的问题,请参考以下文章

数据库中的空值与NULL的区别以及python中的NaN和None

数据库中的空值与NULL的区别以及python中的NaN和None

如何在 Column 中插入没有空值的 Cassandra

如何从 Python 生成的动态循环中删除空值?

数据库中的空值与NULL的区别以及python中的NaN和None

数据库中的空值与NULL的区别以及python中的NaN和None