【问题标题】:How do I read durations correctly with pandas read_excel?如何使用 pandas read_excel 正确读取持续时间?
【发布时间】: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 选项,例如dtypeconverters。似乎没有任何效果。

我发现以 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 或类似方法实现相同的目标?

【问题讨论】:

标签: python pandas


【解决方案1】:

重要的是数据如何存储和保存为您的 Excel 文件。我建议将持续时间信息存储为 Excel 中的“文本”数据类型。

df = pd.read_excel(file)
t = df['Duration'].str.split(':')
df['Duration'] = pd.to_timedelta((t.str[0].astype(int) * 3600
                                + t.str[1].astype(int) * 60
                                + t.str[2].astype(int)), unit='sec')
df

您也可以将其存储为“时间”,但是当您单击单元格的那一刻有风险...精彩的 excel 将基础值更改为浮点数,但是如果您保持为“文本”格式,那么您就不用不用担心。

【讨论】:

  • 我会将此标记为答案,因为如果我可以轻松更改 xlsx 的创建方式,它将解决问题。不过,事后在 excel 中转换类型似乎并不简单。更改类型会更改单元格中的文本!我将不得不继续使用我的清洁功能。
  • @BenCaldwell 我还包括了我用来转换为所需输出的内容。
  • @BenCaldwell 是的。然后,您必须问自己将数据导入excel的来源是什么?最初生成 Excel 文件时,您需要确保将其保存为“文本”,因为这是问题的根源。
猜你喜欢
  • 1970-01-01
  • 2021-10-02
  • 2013-07-16
  • 1970-01-01
  • 1970-01-01
  • 2019-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多