Pandas read_excel:正确解析Excel日期时间字段

sup*_*own 4 python excel datetime pandas

我将以下示例数据存储在 Excel 文件中

宣称 代码1 年龄 日期
7538 第359章 71 2019年11月28日
7538 第359章 71 2019年11月28日
540 第428章 73 2019年10月16日
540 第428章 73 2019年10月16日
605 1670 40 2019年4月12日
第740章 134 55 2019年12月24日

使用 pandas.read_excel API 导入到我的 Jupyter Notebook 时,日期字段的格式不正确:

excel = pd.read_excel('Libro.xlsx')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

然后我得到的日期字段有所不同,因为我在 Excel 文件中对其进行了格式化。我应该应用什么参数read_excel才能显示 Excel 文件中格式化的 DATE 列?

.info()方法,将列输出为 int64

在此输入图像描述

我已经尝试过使用该pd.to_datetime函数,但得到了奇怪的结果:

在此输入图像描述

在以下链接中找到我用于项目的示例 excel 文件sample_raw_data

以下是一些可用于重现从 Excel 读入的 DataFrame 的代码:

excel = pd.DataFrame({
    'CLAIM': {0: 7538, 1: 7538, 2: 540, 3: 540, 4: 4605, 5: 1740, 6: 7605},
    'CODE1': {0: 359, 1: 359, 2: 428, 3: 428, 4: 1670, 5: 134, 6: 415},
    'AGE': {0: 71, 1: 71, 2: 73, 3: 73, 4: 40, 5: 55, 6: 56},
    'DATE': {0: 43797, 1: 43797, 2: 43754, 3: 43754, 4: 43803, 5: 43823,
             6: 43818}
})
Run Code Online (Sandbox Code Playgroud)

Hen*_*ker 12

要将此 Excel 日期转换为datetime64[ns]用于to_datetime获取以天为单位的单位,并从origin“1899-12-30”开始偏移:

excel = pd.read_excel('Libro.xlsx')
excel['DATE'] = pd.to_datetime(excel['DATE'], unit='d', origin='1899-12-30')
Run Code Online (Sandbox Code Playgroud)

excel

excel = pd.read_excel('Libro.xlsx')
excel['DATE'] = pd.to_datetime(excel['DATE'], unit='d', origin='1899-12-30')
Run Code Online (Sandbox Code Playgroud)

info

   CLAIM  CODE1  AGE       DATE
0   7538    359   71 2019-11-28
1   7538    359   71 2019-11-28
2    540    428   73 2019-10-16
3    540    428   73 2019-10-16
4   4605   1670   40 2019-12-04
5   1740    134   55 2019-12-24
6   7605    415   56 2019-12-19
Run Code Online (Sandbox Code Playgroud)

请参阅为什么 1899-12-30 是 Access/SQL Server 中的零日期而不是 12/31?有关为什么这是基准日期的更多信息。


for也可以与read_excelconverter一起DATE使用:

excel = pd.read_excel(
    'Libro.xlsx',
    converters={
        'DATE': lambda x: pd.to_datetime(x, unit='d', origin='1899-12-30')
    }
)
Run Code Online (Sandbox Code Playgroud)

info

 #   Column  Non-Null Count  Dtype         
---  ------  --------------  -----         
 0   CLAIM   7 non-null      int64         
 1   CODE1   7 non-null      int64         
 2   AGE     7 non-null      int64         
 3   DATE    7 non-null      datetime64[ns]
Run Code Online (Sandbox Code Playgroud)