【发布时间】:2021-01-05 03:49:51
【问题描述】:
我有一个 xlsx,其中包含一列格式为 HH:MM:SS 的持续时间。我认为最好将此列视为timedelta 数据类型,但我无法让read_excel 这样做。
要复制此问题,请将以下内容复制到 xlsx 中:
Duration
0 00:14:30
1 01:05:00
2 00:05:02
3 26:53:29
4 36:28:27
5 85:29:34
然后使用类似于以下内容的方式读取 xlsx:
df = pd.read_excel('../data/test.xlsx', engine='openpyxl', index_col=0)
您最终应该得到一个这样的数据框,其中包含时间和日期时间对象:
Duration
0 00:14:30
1 01:05:00
2 00:05:02
3 1900-01-01 02:53:29
4 1900-01-01 12:28:27
5 1900-01-03 13:29:34
我尝试了read_excel 选项,例如dtype 和converters。似乎没有任何效果。
我发现以 timedelta 格式获取此数据的唯一方法是通过使用以下代码将时间值添加到 1900-01-01 00:00:00 来将所有内容转换为日期时间。
def clean_durations(s):
ss = s.copy()
for i,value in s.items():
try:
ss[i] = datetime.combine(date(1900, 1, 1), value)
except TypeError as e:
ss[i] = value + timedelta(days=1) # add an extra day for durations interpreted as datetime
ss = pd.to_datetime(ss) - pd.to_datetime('1900-01-01 00:00:00')
return ss
df = pd.read_excel('../data/test.xlsx', engine='openpyxl', index_col=0, parse_dates=True)
df['Duration'] = clean_durations(df['Duration'])
导致想要的:
Duration
0 0 days 00:14:30
1 0 days 01:05:00
2 0 days 00:05:02
3 1 days 02:53:29
4 1 days 12:28:27
5 3 days 13:29:34
这感觉就像我正在构建一些应该已经成为 pandas 一部分的东西。
谁能提供一种方法来直接使用 pandas read_excel 或类似方法实现相同的目标?
【问题讨论】:
-
@vbn - 不这样做,只是抛出一个类型错误