首页 > 解决方案 > 为什么读入熊猫时日期列会失真?

问题描述

我从 URL 读取了一个 excel 文件,需要进行一些清理才能保存它。在原始的 excel 文件中,前几行有一些标志和空条目,然后才是真正的数据开始。excel 文件中的日期列(未命名 0:) 显示为日期,但由于某种原因读入 pandas 时,它会转换为数字。使用 astype 和 pd.to_datetime 将列转换为日期,但日期不正确。有什么建议吗?

注意:虽然日期列在excel表格中显示为日期,但它的类型是通用的。我可以先在 excel 文件中手动更改类型,但我不想这样做,因为我想自动化该过程。 在此处输入图像描述

如果要生成数据,代码如下:

from requests import get
import pandas as pd

url = 'http://rigcount.bakerhughes.com/static-files/55ff50da-ac65-410d-924c-fe45b23db298'
# make HTTP request to fetch data
r = get(url)

# check if request is success
r.raise_for_status()

# write out byte content to file
with open('out.xlsb', 'wb') as out_file:
    out_file.write(r.content)

Canada_Oil_Gas = pd.read_excel('out.xlsb', sheet_name='Canada Oil & Gas Split', engine='pyxlsb')

标签: pythonexcelpandasdatetypes

解决方案


问题是由单元格格式[$-409]引起的。

您可以手动修复它,如下所示:

df = pd.read_excel('out.xlsb', sheet_name='Canada Oil & Gas Split',
                   skiprows=6, engine='pyxlsb')

df['DATE'] = pd.to_datetime('1899-12-31') + df['DATE'].sub(1).apply(pd.offsets.Day)
print(df.head())

# Output
        DATE  OIL  GAS  MISC  TOTAL       Oil       Gas
0 2000-01-07  134  266     4    404  0.331683  0.658416
1 2000-01-14  169  342     6    517  0.326886  0.661509
2 2000-01-21  186  338     6    530  0.350943  0.637736
3 2000-01-28  171  381     6    558  0.306452  0.682796
4 2000-02-04  157  387     1    545  0.288073  0.710092

-409 美元


推荐阅读