在vscode中安装jupyter
Jupyter 的安装及使用,超详细懂中文就会_jupyter安装-CSDN博客
修改jupyter 默认浏览器
1. 生成 Jupyter 配置文件
如果你还没有 Jupyter 的配置文件,可以通过终端以下命令生成:
jupyter notebook --generate-config
执行该命令后,会在你的用户目录下生成一个名为 .jupyter
的文件夹,其中包含 jupyter_notebook_config.py
配置文件。
2. 找到配置文件路径
一般来说,配置文件的路径在不同操作系统下有所不同:
- Windows:
C:\Users\你的用户名\.jupyter\jupyter_notebook_config.py
3. 编辑配置文件
使用文本编辑器打开 jupyter_notebook_config.py
文件,找到以下行(通常这行是被注释掉的,以 #
开头):
# c.NotebookApp.browser = ''
去掉这行前面的 #
注释符号,然后在其下方添加指定浏览器的代码。
终端打开
jupyter notebook
运行当前单元格并选中下一个单元格
- 快捷键:
Shift + Enter
运行当前单元格但不移动选中单元格
- 快捷键:
Ctrl + Enter
运行当前单元格并在下方插入新单元格
- 快捷键:
Alt + Enter
在命令模式下(选中代码块头部)
- A:在当前单元格上方插入一个新的单元格。
- B:在当前单元格下方插入一个新的单元格。
- Y:将当前单元格的类型设置为代码单元格。
- M:将当前单元格的类型设置为 Markdown 单元格。
- D + D:快速按下两次
D
键,可以删除当前选中的单元格。
import pymysql
import pandas as pd
# 连接mysql
conn = pymysql.connect(host='你的主机名', user='用户名',password='密码',database='数据库名称',charset="utf8")
sql_1 = "select * from table_name limit 10"
#利用pandas直接获取数据
data = pd.read_sql(sql_1, conn)
conn.close()
点new python3
重启内核
在 Jupyter Notebook 里若不借助 Python 语句,单纯使用 SQL 来操作 MySQL 数据库,你可以借助 ipython-sql
这个扩展工具。下面是详细的操作步骤与示例:
1. 安装 ipython-sql
扩展
运用 pip
来安装 ipython-sql
扩展: 终端 pip install
在 Jupyter Notebook 的代码单元格中输入以下命令并运行:
python
!pip install ipython-sql
安装完成后,你可以通过加载 ipython-sql
扩展来验证是否安装成功,在新的代码单元格中输入并运行以下代码:
%load_ext sql
如果你想使用 pandas
通过 SQL 查询来获取数据,你需要先创建一个 SQLAlchemy engine
连接对象。下面是如何设置和使用它的步骤:
1. 安装 SQLAlchemy 和 pymysql
如果你还没有安装 SQLAlchemy
和 pymysql
,你可以通过以下命令安装:
pip install sqlalchemy pymysql
2. 创建数据库连接
使用 SQLAlchemy
来创建连接对象:
from sqlalchemy import create_engine# 创建数据库连接
engine = create_engine('mysql+pymysql://root:123456@localhost:3306/my_db')# 执行查询
import pandas as pd
query = "SELECT * FROM p_34bop_og_user"
result = pd.read_sql(query, con=engine)# 输出结果
print(result)
在这段代码中,create_engine
用于创建一个连接到 MySQL 数据库的 engine
对象。你可以根据你的数据库连接信息修改连接字符串(root:123456@localhost:3306/my_db
),这里的 root
是用户名,123456
是密码,localhost:3306
是主机和端口,my_db
是数据库名称。
3. 执行查询
pd.read_sql(query, con=engine)
语句将 SQL 查询结果加载到 pandas DataFrame 中。
使用 pymysql
直接执行查询
如果你更倾向于使用 PyMySQL
,也可以直接用 PyMySQL
执行查询,避免 SQLAlchemy
参与
只有这个可以用
import pymysql
import pandas as pd# 连接到数据库
connection = pymysql.connect(host='localhost',user='root',password='123456',database='my_db')# 定义查询
query = """
SELECT DISTINCT t1.COD_BRCH_OU_TR AS 机构号,t1.ID_INTL_USER_TR AS 员工号,t1.DATE_REQ AS 时间
FROM p_34tpup_ucap_term_jrn_infoa t1
INNER JOIN P_34BOP_OG_USER t3 ON t1.ID_INTL_USER_TR = t3.ID_INTL_USER_TRAND t3.NUM_ROL_USER in ('990050','990030','990310','990330','990051','990031','990311','990331') -- 柜员身份标识
WHERE NOT EXISTS (SELECT 1FROM p_34tpup_ucap_term_jrn_infoa t2WHERE t2.COD_BRCH_OU_TR = t1.COD_BRCH_OU_TR -- 关联同一机构AND t2.ID_INTL_USER_TR = t1.ID_INTL_USER_TR -- 关联同一员工AND t2.DATE_REQ = t1.DATE_REQ -- 关联同一天AND t2.COD_TR_BOEC_CLI = '61606' -- 操作代码限制AND t2.TIME_START_TR < STR_TO_DATE(CONCAT(t2.DATE_REQ, '140000'), '%Y%m%d%H%i%s.%f') -- 时间 >= 14:00:00);
"""# 使用 PyMySQL 执行查询
with connection.cursor() as cursor:cursor.execute(query)result = cursor.fetchall()columns = [desc[0] for desc in cursor.description] # 获取列名result_df = pd.DataFrame(result, columns=columns)# 输出结果
print(result_df)# 关闭连接
connection.close()
使用 SQLAlchemy
执行查询
我们可以使用 SQLAlchemy
直接执行查询,并通过 pandas
获取结果。这样可以完全避免 PyMySQL
的格式化问题。
解决方法:使用 text()
包装 SQL 查询
text()
是 SQLAlchemy
提供的一个函数,它将一个普通字符串转换为 SQL 查询的可执行对象。
from sqlalchemy import create_engine, text
import pandas as pd# 创建数据库连接
engine = create_engine('mysql+pymysql://root:123456@localhost:3306/my_db')# 定义查询
query = """
SELECT DISTINCT t1.COD_BRCH_OU_TR AS 机构号,t1.ID_INTL_USER_TR AS 员工号,t1.DATE_REQ AS 时间
FROM p_34tpup_ucap_term_jrn_infoa t1
INNER JOIN P_34BOP_OG_USER t3 ON t1.ID_INTL_USER_TR = t3.ID_INTL_USER_TRAND t3.NUM_ROL_USER in ('990050','990030','990310','990330','990051','990031','990311','990331') -- 柜员身份标识
WHERE NOT EXISTS (SELECT 1FROM p_34tpup_ucap_term_jrn_infoa t2WHERE t2.COD_BRCH_OU_TR = t1.COD_BRCH_OU_TR -- 关联同一机构AND t2.ID_INTL_USER_TR = t1.ID_INTL_USER_TR -- 关联同一员工AND t2.DATE_REQ = t1.DATE_REQ -- 关联同一天AND t2.COD_TR_BOEC_CLI = '61606' -- 操作代码限制AND t2.TIME_START_TR < STR_TO_DATE(CONCAT(t2.DATE_REQ, '140000'), '%Y%m%d%H%i%s.%f') -- 时间 >= 14:00:00);
"""# 通过 SQLAlchemy 执行查询
with engine.connect() as connection:result = connection.execute(text(query))result_df = pd.DataFrame(result.fetchall(), columns=result.keys())# 输出结果
print(result_df)
AND t2.TIME_START_TR < STR_TO_DATE(CONCAT(t2.DATE_REQ, '140000'), '%Y%m%d%H%i%s.%f') -- 时间 >= 14:00:00 因为TIME_START_TR 2023-03-10 11:01:10.978000是这样的格式,t2.DATE_REQ是20230310,加上140000,数字的格式也不一样呀,数字的个数也不同 ,为什么可以这样写呢,还能运行
这部分的作用是将 t2.DATE_REQ
(格式为 YYYYMMDD
)和 '140000'
(代表 14:00:00
,即 14 点整)拼接成一个新的字符串,再用 STR_TO_DATE()
转换为一个时间戳。具体来说:
1. t2.DATE_REQ
和 '140000'
拼接
t2.DATE_REQ
是日期字符串,格式是YYYYMMDD
(例如:20230310
)。'140000'
是代表14:00:00
的字符串,表示时间。
拼接后的字符串会是 YYYYMMDD
+ 140000
,比如对于 20230310
,拼接后的结果是:20230310140000
,这就代表了 2023 年 3 月 10 日的 14:00:00
。
2. 使用 STR_TO_DATE()
转换为时间格式
STR_TO_DATE()
函数将拼接后的字符串转换成DATETIME
类型。- 格式化字符串
'%Y%m%d%H%i%s'
告诉 MySQL 如何解析这个拼接的字符串:%Y
:四位年份(2023
)%m
:两位月份(03
)%d
:两位日期(10
)%H
:小时(14
)%i
:分钟(00
)%s
:秒数(00
)
3. 时间比较
- 转换后的
STR_TO_DATE(CONCAT(t2.DATE_REQ, '140000'), '%Y%m%d%H%i%s')
会得到一个DATETIME
类型的时间(例如:2023-03-10 14:00:00
)。 - 然后,
t2.TIME_START_TR
(如2023-03-10 11:01:10.978000
)会与该时间进行比较,看是否小于14:00:00
。
为什么可以这样做?
- 拼接日期和时间:通过拼接日期和时间,
'140000'
(即14:00:00
)能被正确地合并到t2.DATE_REQ
中,形成一个完整的时间字符串。 STR_TO_DATE()
转换:MySQL 的STR_TO_DATE()
函数非常灵活,能够根据你指定的格式将字符串转换为时间戳,即使原始数据是纯数字或字符串,能够将其转化为符合日期格式的时间。
总结
- 通过拼接
t2.DATE_REQ
(日期)和'140000'
(固定的时间部分),我们构造了一个新的时间字符串(YYYYMMDD140000
)。 - 然后,使用
STR_TO_DATE()
函数,将其转换为标准的DATETIME
格式YYYY-MM-DD HH:MM:SS
。 - 这段 SQL 语句能够判断
t2.TIME_START_TR
是否在14:00:00
之前。
这个 STR_TO_DATE()
调用确实是将拼接的字符串转换为标准的 DATETIME
格式:YYYY-MM-DD HH:MM:SS
,并且会 忽略小数点后的微秒部分。
详细分析:
-
STR_TO_DATE(CONCAT(t2.DATE_REQ, '140000'), '%Y%m%d%H%i%s')
- 这里的
STR_TO_DATE()
将拼接后的字符串(比如20230310140000
)转换为DATETIME
类型。 - 格式
'%Y%m%d%H%i%s'
指定了年、月、日、小时、分钟和秒,但没有包含微秒(即.%f
)。 - 结果是 不包含微秒部分,只有到秒的精度:
2023-03-10 14:00:00
。
- 这里的
-
t2.TIME_START_TR
的格式是YYYY-MM-DD HH:MM:SS.ssssss
,包括微秒部分。- 当进行比较时,
STR_TO_DATE()
转换后的结果是精确到秒的时间,而t2.TIME_START_TR
仍然保留微秒部分。 - 由于
STR_TO_DATE()
转换后不包含微秒部分,比较时会默认忽略微秒,只比较到秒。
- 当进行比较时,
举个例子:
假设 t2.DATE_REQ
是 20230310
(即 2023-03-10
),并且我们拼接上 '140000'
(表示 14:00:00
),得到的结果是 20230310140000
,转换后得到的时间是 2023-03-10 14:00:00
(没有微秒部分)。
而 t2.TIME_START_TR
可能是 2023-03-10 11:01:10.978000
,其中 10.978000
是微秒部分。由于 STR_TO_DATE()
只会转换到秒级别,比较时 t2.TIME_START_TR
的微秒部分会被忽略,只比较到 2023-03-10 11:01:10
,因此微秒对结果没有影响。
总结:
- 小数点后的微秒部分在这个查询中是被忽略的,因为
STR_TO_DATE()
中使用的格式'%Y%m%d%H%i%s'
只处理到秒级别,没有处理微秒。 - 如果你希望包含微秒进行比较,需要调整格式化字符串,比如使用
'%Y%m%d%H%i%s.%f'
来处理微秒部分。
希望这个解释更清楚了!如果你有其他问题或者需要更详细的帮助,随时告诉我!