【发布时间】: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() ???还在答案中为您的日期列提供了部分解决方案
-
效果最好,但这正是我想要避免的,因为这些文件是数据管道的一部分......