【问题标题】:Fixing a type error when passing data from csv to SQL将数据从 csv 传递到 SQL 时修复类型错误
【发布时间】:2018-02-23 09:22:48
【问题描述】:

场景: 继上一个问题 (Removing the timestamp from a datetime in pandas dataframe) 之后,我有一个代码可以将数据从 excel 读取到 pandas 数据框,并使用命令 dataframe.to_sql 将该数据插入到给定的SQL 数据库。

问题:由于我的日期是以美国格式 (mm/dd/yyyy) 检索的,而我的数据库是国际格式 (dd/mm/yyyy),因此尝试时出现类型错误将我的数据上传到 SQL。

我已经尝试过的:我尝试了上一个问题中给出的建议,并以这种方式运行数据更改,但是当我尝试上传到 SQL 时出现错误。

我目前正在使用的线路:

fnl['Date'] = pd.to_datetime(fnl['Maturity'], errors='coerce')

允许代码运行,但在 SQL 中产生问题。

我也试过了:

fnl['Date'] = pd.to_datetime(fnl['Date'], format='%m/%d/%Y', errors:'coerce')

fnl['Date'] = pd.to_datetime(fnl['Date'], format='%m/%d/%Y')

仍然没有成功。

之前我把代码开头的所有编码都改成了utf-8,所以看不出问题出在哪里。

问题:我该如何解决这个问题?

数据示例:

Date
1/15/2023
1/15/2023
6/30/2023
6/30/2023
8/1/2022
8/1/2022
7/25/2022
7/25/2022
7/19/2024
7/13/2022
7/13/2022

【问题讨论】:

  • 我将 UTF-8 与 MySQL 相关联,因此我删除了 SQL Server 标记。您应该使用您真正使用的数据库进行标记。
  • 第二行的语法不正确。解决这个问题,看看会发生什么。另外,请在此处包含您的错误消息,以便我们了解您的问题。
  • 如果我们能看到您的专栏是什么样子,那将会有所帮助。我认为你的格式是错误的。
  • @GordonLinoff 你说得对,我不知道有什么区别,谢谢你的编辑。
  • @cᴏʟᴅsᴘᴇᴇᴅ 我将使用部分列数据更新问题。关于错误,请原谅我的无能,但我找不到它。需要说明吗?

标签: python mysql sql pandas


【解决方案1】:

如果您的 Date 列以国际格式返回日期,您需要在转换为日期时间时反映这一点。

fnl['Date'] = pd.to_datetime(fnl['Date'], format='%m/%d/%Y', errors='coerce')

您需要在源中指定格式,以便正确完成转换。


如果要将日期时间转换回%m/%d/%Y 格式的字符串,请使用.dt.strftime 函数:

fnl['DateString'] = fnl['Date'].dt.strftime('%d/%m/%Y')

s = pd.to_datetime(df['Date'], format='%m/%d/%Y', errors='coerce')
s

0    2023-01-15
1    2023-01-15
2    2023-06-30
3    2023-06-30
4    2022-08-01
5    2022-08-01
6    2022-07-25
7    2022-07-25
8    2024-07-19
9    2022-07-13
10   2022-07-13
Name: Date, dtype: datetime64[ns]

s = s.dt.strftime('%d/%m/%Y')
s

0     15/01/2023
1     15/01/2023
2     30/06/2023
3     30/06/2023
4     01/08/2022
5     01/08/2022
6     25/07/2022
7     25/07/2022
8     19/07/2024
9     13/07/2022
10    13/07/2022
Name: Date, dtype: object

【讨论】:

  • 感谢您的回答。我在强制之后更改了错误并指定了来自源数据的格式。代码像以前一样运行,但我的数据随后更改为“NaT”(列中的所有值)。
  • @DGMS89 添加了演示。
  • 我看到了您的示例,并且了解使用这些功能时存在差异。我的数据更改为 NaT 的原因是什么?
  • @DGMS89 如果您的数据不符合格式,或者如果它根本不是可解析的日期字符串,则会“强制”到 NaT。
  • 明白。我尝试更改格式以匹配 python 产生的错误,并得到以下结果:“ValueError: time data u'--' doesn't match format specified”。我还尝试更改错误='忽略',这似乎有效,但是当我使用 (fnl['Maturity'] = fnl['Maturity'].dt.date) 从日期中删除时间时,我得到以下信息错误:(AttributeError:只能将 .dt 访问器与 datetimelike 值一起使用)。任何想法为什么会发生这种情况?
猜你喜欢
  • 2016-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多