python 在excel文件中写入date日期数据,以及读取excel日期数据,如何在python中正确显示date日期。

本文介绍如何使用Python将日期写入Excel文件,并确保日期格式正确显示,而非浮点数。文章详细解释了xlwt库的工作原理,并提供了一个具体示例来说明如何设置样式以正确显示日期。

如何通过python写入date数据了?

写入还是很简单的。

import xlwt3

import  datetime as dt

workbook = xlwt.Workbook()

worksheet = workbook.add_sheet('Sheet1')

worksheet.write(0, 0, dt.date.today())

workbook.save('test.xls')

 

查看一下,确实写入了,但变成了一个数字。怎么回事了,原来excel保存日期采用的是float类型保存。

查看worksheet.write:

Help on method write in module xlwt3.worksheet:

write(self, r, c, label=b'', style=<xlwt3.style.XFStyle object>) method of xlwt3
.worksheet.Worksheet instance

太简单了,label是什么?

只能查看源码了:   

def write(self, r, c, label=b"", style=style.default_style):
        self.row(r).write(c, label, style)

继续挖掘:

    def write(self, col, label, style=style.default_style):
        self.__adjust_height(style)
        self.__adjust_bound_col_idx(col)
        style_index = self.__parent_wb.add_style(style)
        if isinstance(label, str):
            if len(label) > 0:
                self.insert_cell(col,
                    StrCell(self.__idx, col, style_index, self.__parent_wb.add_str(label))
                    )
            else:
                self.insert_cell(col, BlankCell(self.__idx, col, style_index))
        elif isinstance(label, bool): # bool is subclass of int; test bool first
            self.insert_cell(col, BooleanCell(self.__idx, col, style_index, label))
        elif isinstance(label, (float, int, Decimal)):
            self.insert_cell(col, NumberCell(self.__idx, col, style_index, label))
        elif isinstance(label, (dt.datetime, dt.date, dt.time)):
            date_number = self.__excel_date_dt(label)
            self.insert_cell(col, NumberCell(self.__idx, col, style_index, date_number))
        elif label is None:
            self.insert_cell(col, BlankCell(self.__idx, col, style_index))
        elif isinstance(label, formula.Formula):
            self.__parent_wb.add_sheet_reference(label)
            self.insert_cell(col, FormulaCell(self.__idx, col, style_index, label))
        else:
            raise Exception("Unexpected data type %r" % type(label))

 

原来:

        elif isinstance(label, (dt.datetime, dt.date, dt.time)):
            date_number = self.__excel_date_dt(label)
            self.insert_cell(col, NumberCell(self.__idx, col, style_index, date_number))

label的数值,会先进行判断,然后进行处理。

这样,只需要设置一下style就可以了!

dateFormat = xlwt.XFStyle()

dateFormat.num_format_str = 'yyyy/mm/dd'

worksheet.write(0, 0, dt.date.today(),dateFormat)

workbook.save('test.xls')

搞定。

注意一下:

python的date 和excel的date是不一样的。

实验一下:

dt.date.today().toordinal()##2015/6/19

735768

读取一下excel的数值了?

import xlrd

worksheetRead = xlrd.open_workbook('test.xls')
sheetRead=Rd.sheet_by_index(0)

sheetRead.cell(0,0).value

42174

 

差别真不小!!

WHY?

原来:python是从公元1年1月1日开始的天数转换 的!

excel是从1899年12月 31号开始的。

做一个函数转换一下即可:

__s_date = dt.date (1899, 12, 31).toordinal() - 1
def getdate(date ):
    if isinstance(date , float ):
        date = int(date )
    d = dt.date .fromordinal(__s_date + date )
    return d

 

ok,over!!

 

 

 

 

<think>好的,我现在需要帮助用户将Python读取Excel数据存储到数据库中。用户的问题是关于具体方法的,所以我要分步骤解释清楚。首先,我应该回顾之前的引用内容,看看有没有相关的信息可以利用。引用1提到使用pandas和PyMySQL,引用2和3也提到了类似的库,比如sqlalchemy和openpyxl。这些信息应该能帮助我构建一个详细的步骤指南。 首先,用户需要安装必要的库。根据引用3,pandas、sqlalchemy、openpyxl和pymysql都是必须的。所以第一步应该是安装这些库。用户可能已经安装了其中一些,但最好还是列出所有需要的库,并给出安装命令,比如pip install pandas pymysql sqlalchemy openpyxl。 接下来是读取Excel文件。引用1和3都提到用pandas的read_excel函数,所以这里需要详细说明如何使用这个函数,包括指定文件路径和可能的参数,比如sheet_name。还要注意文件格式,比如.xlsx需要openpyxl支持,这一点要提一下。 然后是数据预处理。这部分用户可能需要检查数据是否有缺失值或重复值,进行清理。比如使用dropna()和drop_duplicates()方法,或者填充缺失值。这里需要给出示例代码,让用户清楚如何操作。 接下来是连接数据库。引用1和3提到了PyMySQL和sqlalchemy。使用sqlalchemy的create_engine来建立连接会更方便,所以需要展示如何构建连接字符串,包括主机名、端口、用户名、密码、数据库名等信息。同时,要提醒用户替换这些占位符为实际的值。 存储数据数据库。这里可以用to_sql方法,指定表名和连接对象。需要提到if_exists参数的处理方式,比如替换现有表或追加数据,还有index参数是否保留索引。可能还需要提到分块写入(chunksize)对于大数据集的处理。 最后是验证数据,建议用户查询数据库,确认数据是否正确导入。给出一个简单的SELECT查询示例,或者使用pandas的read_sql来检查。 可能还需要考虑其他因素,比如数据库表的预先创建,或者字段类型是否匹配。如果用户的数据表已经存在,是否需要调整字段类型,或者让pandas自动创建表。这些细节可能需要简要提及,或者作为注意事项。 在相关问题的部分,应该引导用户深入探讨性能优化、处理大数据集、数据清洗或定时任务等。比如,如何优化导入速度,或者处理Excel中的复杂格式,或者设置自动化脚本。 现在需要确保每个步骤的代码示例正确,并且语法无误。比如,在create_engine的连接字符串中,正确使用mysql+pymysql://的格式。同时,提醒用户处理敏感信息,比如密码,不要硬编码在代码中,可以考虑使用环境变量或配置文件。 可能还需要提到异常处理,比如在连接数据库时加入try-except块,捕获可能的错误,提高代码的健壮性。但为了简洁,可能在主要步骤中不展开,放在相关问题里。 总结一下,回答的结构应该是步骤分明,代码示例清晰,注意事项和常见问题都涵盖到,同时引用之前的参考内容来支持步骤的正确性。确保使用中文,并且按照用户的要求,行内公式用$...$,独立公式用$$...$$,不过在这个问题中可能用不到数学公式,所以可能不需要。但如果有数据处理中的计算,比如数据标准化,可能需要提到,但这里可能不涉及。 最后检查是否有遗漏的步骤,比如数据预处理的具体方法,或者数据库连接的其他参数,比如字符编码等。确保所有步骤连贯,用户能够按照指南一步步操作成功。</think>以下是将Excel数据导入数据库的完整步骤说明: ### 一、安装依赖库 ```bash pip install pandas openpyxl pymysql sqlalchemy ``` *Pandas用于数据处理,openpyxl处理xlsx文件,pymysql/sqlalchemy用于数据库操作* ### 二、完整实现代码 ```python import pandas as pd from sqlalchemy import create_engine # 1. 读取Excel文件 def read_excel(file_path): df = pd.read_excel(file_path, engine='openpyxl') # engine参数必须指定[^3] print(f"成功读取{len(df)}条数据") return df # 2. 数据预处理 def clean_data(df): # 处理空值:删除全空行 df = df.dropna(how='all') # 处理重复值 df = df.drop_duplicates() # 格式转换示例:日期格式化 if 'date_column' in df.columns: df['date_column'] = pd.to_datetime(df['date_column']) return df # 3. 数据库连接 def get_db_connection(): # 格式:mysql+pymysql://用户名:密码@地址:端口/数据库名 engine = create_engine('mysql+pymysql://user:password@localhost:3306/mydb?charset=utf8mb4') return engine # 4. 数据写入 def to_database(df, table_name): engine = get_db_connection() # if_exists: fail(默认)/replace/append df.to_sql(name=table_name, con=engine, index=False, # 不保留行索引 if_exists='append', chunksize=1000) # 分块写入提升性能 print(f"成功写入{len(df)}条数据到{table_name}") # 主程序 if __name__ == "__main__": data = read_excel("data.xlsx") cleaned_data = clean_data(data) to_database(cleaned_data, "excel_data") ``` ### 三、关键技术说明 1. **编码处理**:建议在连接字符串添加`?charset=utf8mb4`参数,避免中文乱码 2. **异常处理**:可添加try-except块捕获以下异常: ```python from sqlalchemy.exc import SQLAlchemyError try: # 数据库操作代码 except SQLAlchemyError as e: print(f"数据库错误: {str(e)}") ``` 3. **性能优化**:通过`chunksize`参数分块写入(默认全量写入),万级以上数据建议设置500-2000的数值 ### 四、验证数据 ```python # 查询验证 engine = get_db_connection() check_df = pd.read_sql("SELECT * FROM excel_data LIMIT 5", con=engine) print(check_df) ``` ### 五、注意事项 1. **字段类型映射**:Pandas自动转换类型规则: - int -> INT(11) - float -> DOUBLE - datetime -> DATETIME - object -> TEXT 2. **表结构预设**:建议先创建带注释的数据库表: ```sql CREATE TABLE excel_data ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) COMMENT '姓名', age INT COMMENT '年龄', create_time DATETIME COMMENT '创建时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值