【问题标题】:Pandas read_excel function is not able to import date and time fields properlyPandas read_excel 函数无法正确导入日期和时间字段
【发布时间】:2022-01-07 19:03:31
【问题描述】:

我正在阅读具有日期和时间两个单独字段的 Excel 文件。 这是我在 excel 中打开文件时它们的样子:

Local Date  Local Time
31/08/2021  14:09:53
31/08/2021  14:11:52
31/08/2021  14:11:02
31/08/2021  14:09:25

现在,我正在使用以下代码:

df_tmp = pd.read_excel('1-5.xlsb', parse_dates=[['Local Date','Local Time']])

这就是我得到的:

Local Date_Local Time
31/08/2021 0.5901967592592593
31/08/2021 0.5915740740740741

此外,当我探索内容时

df_tmp['Local Date_Local Time'].str.len().unique()

我可以看到一大堆案例:

array([29, 28, 20, 18, 19, 16, 15, 17, 14, 24, 23, 11, 10, 13, 12, 27, 26,
       25, 33, 32, 31, 30,  9], dtype=int64)

所以最短的情况用一个非常奇怪的日期表示:

df_tmp[df_tmp['Local Date_Local Time'].str.len()==13].head(2)

Local Date_Local Time   
44205 0.90375   
44205 0.92625

在 excel 中,相同的值如下所示:

1/9/2021    21:41:24
1/9/2021    21:21:35

较长的 (len>13) 看起来像正常的日期,只是时间是小数。

我知道如何处理每种情况,因此应该将 44205 转换为以 1899-12-31 为基数的日期; 0.90375 也是一天中的一小部分,但我的问题是为什么在 excel 中一切正常,没有任何努力,在这里我必须发明棘手的转换器?也许有一个更简单的方法,我错过了什么?


更新(2021 年 10 月 1 日): 好的,为了简化和本地化问题,我做了以下操作:

df_tmp = pd.read_excel('1-5.xlsb', converters={'Local Date':str})
df_tmp['Local Date'].unique()
array(['31/08/2021', '44205', '30/08/2021', '28/08/2021', '29/08/2021',
       '44236', '44264', '44295', '44325'], dtype=object)

如果我在 excel 中将文件保存为“xlsx”,那么结果会有所不同:

array(['31/08/2021', '2021-01-09 00:00:00', '30/08/2021', '28/08/2021',
       '29/08/2021', '2021-02-09 00:00:00', '2021-03-09 00:00:00',
       '2021-04-09 00:00:00', '2021-05-09 00:00:00'], dtype=object)

请注意,从 int 转换的日期具有混合的日期和月份 - 应该是从 8 月 28 日到 9 月 5 日的日期间隔 - 所以这似乎是 excel 中原始数据的问题. 无论如何,为了处理这种情况,我做了以下事情:

def date_parser(x):
    if type(x) == int:
        y = pd.to_datetime(pd.to_datetime(x, unit='D', origin='1899-12-30').strftime(format='%Y-%d-%m'))
    else:
        y = pd.to_datetime(x, dayfirst=True)
    return y
df_tmp = pd.read_excel('1-5.xlsb', converters={'Local Date':date_parser})

那么,增加时间并不是什么大问题。感谢您的帮助!

【问题讨论】:

  • 尝试先将它们设为字符串,然后在组合后将它们转换为日期时间 pd.to_datetime(df_temp['Local Date_Local Time'])
  • 这也不起作用,它们被导入甚至分隔为这些奇怪的数字。奇怪的是,有些日期是作为日期导入的,但有些是作为数字导入的……在 excel 中一切正常
  • 不确定是否可以选择将工作表转换为 csv 和 read_csv() ???还在答案中为您的日期列提供了部分解决方案
  • 效果最好,但这正是我想要避免的,因为这些文件是数据管道的一部分......

标签: python excel pandas


【解决方案1】:

你的日期是第一天,这就是为什么你的一些日期看起来不错,而另一些则不然。对于您可以执行此操作的日期:

date_parser = lambda x: datetime.datetime.strptime(x, "%d/%m/%Y")
pd.read_excel('test.xlsb', parse_dates=['Local Date'], date_parser=date_parser)

注意读入 pandas 后日期格式会发生变化

  Local Date  Local Time
0 2021-08-31    0.590197
1 2021-08-31    0.591574
2 2021-08-31    0.590995
3 2021-08-31    0.589873

如果你想创建一个日期时间字段,你可以这样做。请注意,有一个弃用警告,但我没有时间更正它...

date_parser = lambda x, y: datetime.datetime.strptime(x, "%d/%m/%Y") + pd.to_timedelta(y, unit='D')
pd.read_excel('test.xlsb', parse_dates=[['Local Date','Local Time']], date_parser=date_parser)

       Local Date_Local Time
0 2021-08-31 14:09:52.999977
1 2021-08-31 14:11:51.999993
2 2021-08-31 14:11:01.999968
3 2021-08-31 14:09:24.999984

【讨论】:

  • 看起来excel文件的问题不在于日期是dd/mm,而是其中一些存储为日期,但其中一些存储为整数:date_parser = lambda x: pd.to_datetime (x, dayfirst = True) df_tmp = pd.read_excel('1-5.xlsb', parse_dates=['Local Date'], date_parser=date_parser ) df_tmp['Local Date'].unique() 我明白了: 数组(['2021-08-31T00:00:00.000000000', '1970-01-01T00:00:00.000044205', '2021-08-29T00:00:00.000000000', '1970-01-01T040:00:0023. ', '1970-01-01T00:00:00.000044325'], dtype='datetime64[ns]')
猜你喜欢
  • 2021-10-02
  • 2017-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多