【问题标题】:Pandas read_excel: parsing Excel datetime field correctlyPandas read_excel:正确解析 Excel 日期时间字段
【发布时间】:2021-10-02 13:34:48
【问题描述】:

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

CLAIM CODE1 AGE DATE
7538 359 71 28/11/2019
7538 359 71 28/11/2019
540 428 73 16/10/2019
540 428 73 16/10/2019
605 1670 40 04/12/2019
740 134 55 24/12/2019

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

excel = pd.read_excel('Libro.xlsx')

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

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

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

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

这里有一些代码可以用来重现从 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}
})

【问题讨论】:

  • 你需要在pd.read_excel中使用date_parser参数
  • date_parser 将不起作用,因为 pandas 会将 DATE 识别为 int,因此不应用日期解析器。并且尝试将 Date 的 dtype 强制为 datetime64[ns] 将得到与 1970-01-01 日期相同的错误。 @尔凡

标签: pandas datetime


【解决方案1】:

要将此 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')

excel:

   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

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]

请参阅Why is 1899-12-30 the zero date in Access / SQL Server instead of 12/31?,了解有关为什么这是基准日期的更多信息。


DATE 的 converter 也可以与 read_excel 一起使用:

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

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]

【讨论】:

  • pd.to_datetime 有一个关键字origin 可以用来设置“excel epoch”,不需要timedelta
  • 太棒了,Henry Ecker,感谢您的帮助,我测试了它,并且像魅力一样工作!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-14
  • 2019-02-09
  • 1970-01-01
  • 2015-12-19
  • 1970-01-01
  • 2018-06-20
相关资源
最近更新 更多