首页 > 解决方案 > 如何将 pandas datetime64 转换为可以被 Django 识别为 DateField 的东西?

问题描述

当我使用熊猫加载 Excel 时,包含日期的列被正确识别为datetime64

excel_table = pd.read_excel(path, sheet_name=ws_name, header=2) 
print(excel_table['Start Date'])

# output:
0       2001-01-31
1       2001-03-02
2       2001-07-23
3       2001-07-25
4       2002-03-11
...
Name: Start Date, Length: 11056, dtype: datetime64[ns]

然后,我写excel_table了一个 sqlite3 数据库:

excel_table.to_sql(table_name, cols_to_use, index=False)

当我使用 检查列时PRAGMA table_info(TABLENAME),我得到了这个:

...
11|Start Date|NUM|0||0
...

不应该是TIMESTAMP而不是NUM吗?

然后,我使用 Django 的inspectdb方法生成了一个模型类,它给了我这个:

# This is an auto-generated Django model module.
# You'll have to do the following manually to clean this up:
#   * Rearrange models' order
#   * Make sure each model has one field with primary_key=True
#   * Make sure each ForeignKey and OneToOneField has `on_delete` set to the desired behavior
#   * Remove `managed = False` lines if you wish to allow Django to create, modify, and delete the table
# Feel free to rename the models, but don't rename db_table values or field names.
from django.db import models


class TableName(models.Model):

    start_date = models.TextField(db_column='Start Date', blank=True, null=True)  # Field name made lowercase. Field renamed to remove unsuitable characters. This field type is a guess.


    class Meta:
        managed = False
        db_table = 'TableName'

现在,它是 aTextField而不是 a DateField,这是有问题的,因为我正在尝试在此列上实现过滤和排序功能(例如过滤 2020-12-31 之后的日期等)。

我在哪里犯了错误,我该如何解决?

标签: pythondjangopandasdjango-models

解决方案


在 models.py 中,将start_date字段声明为DateField(或DateTimeField

datetime64数据框的 dtype 将自动转换为 MySQL 或 SQLite 的更正类型。

在 serializers.py 中,添加以下行:

from rest_framework import serializers

start_date = serializers.DateTimeField(format="%Y-%m-%d")

旧答案

也许您可以尝试将其转换datetime64为 python 日期时间并导出到数据库:

df['Start Date'] = df['Start Date'].dt.to_pydatetime()

推荐阅读