【问题标题】:Pandas time conversion and elapsed time熊猫时间转换和经过时间
【发布时间】:2021-05-30 10:30:42
【问题描述】:

我有一个包含列的 pandas 数据框:

['A'] 出发时间(以整数形式列出,例如:700 或 403,即 7:00 和 4:03);

['B'] 已用时间(以整数形式列出,例如:70 或 656,即 70 分钟和 656 分钟);

['C'] 到达时间(以整数形式列出:1810 和 355,即 18:10 和 03:55)。

我需要找到一种方法来开发一个具有布尔值的新列 ['D'],如果在第二天到达,则返回 True,如果在同一天到达,则返回 False。

我想访问 A 列的 -2 索引以将小时转换为分钟,然后添加剩余的分钟以标准化值,但不确定如何执行此操作,或者是否有更简单的方法可以找到它。这背后的想法是从一天开始的那一刻起获得总分钟数,如果超过一天的总分钟数,那么我会得到答案,但不确定这是否可行。

【问题讨论】:

  • 101 -> 10:10 还是 1:10? 24 小时制是否无处不在?
  • 请向我们提供数据集样本以帮助您
  • @ anon01 24h 被认为无处不在,是的 - 没有“上午”或“下午”信息。@Cadone 不确定如何添加数据集的样本,但我会尝试。为了什么值得,这是一个 .txt 文件,大约有 35 列。这些列 A、B 和 C 已更改为 int astype 以帮助我计算,但每列的行数相同,每列大约 100 万行。我 必须 创建一个新列,遍历每一行并返回 True 表示超过第二天的时间(A 表示出发时间,B 表示经过的时间,C 表示到达时间)但没有日期信息,只是时间。

标签: python pandas numpy time jupyter


【解决方案1】:

与您概述的方法类似,您可以通过将 A 列中的整数转换为 24 小时日期时间(从 1900-01-01 开始),将 B 列中的整数分钟数添加为一个 timedelta 然后检查结果是否仍在该月的第 1 天。作为健全性检查,我确保最后一行应该返回 True

您可以在不创建新列的情况下组合这些步骤,但我认为这样的代码更具可读性。

import numpy as np
import pandas as pd
import datetime as dt

df = pd.DataFrame({
    'A':[700,403,2359],
    'B':[70,656,2],
    'C':[810,1059,1]
})

# convert to string, add leading zeros, then convert column A to datetime
df['arrival'] = pd.to_datetime(df['A'].astype(str).str.zfill(4), format='%H%M') + pd.to_timedelta(df['B'],'m')

# check if you are on day 1 of the month still
df['D'] = np.where(df.arrival.dt.day > 1, True, False)

输出:

      A    B     C             arrival      D
0   700   70   810 1900-01-01 08:10:00  False
1   403  656  1059 1900-01-01 14:59:00  False
2  2359    2     1 1900-01-02 00:01:00   True

【讨论】:

  • 谢谢德里克。我知道我没有提到这个问题,但没有“日期”信息。是否有必要添加日期时间并完成所有这些?此外,您在那里创建了一个包含每个列值的字典,但是在实际数据集中,我有数百万行,这似乎不适用于大括号之间的 df['A]:df['A'] { }.
  • 我知道没有日期信息,但是日期时间默认为 1900-01-01,这实际上很有用,因为这样您就可以知道您何时到达第二天。我创建的df DataFrame 也只是一个示例。您可以在 DataFrame 上超过该点的代码。我不知道这是否是最有效的方法,因为可能有一个技巧可以让它更快,但让我知道它是否有效。
猜你喜欢
  • 1970-01-01
  • 2019-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-28
  • 2014-10-28
  • 2015-11-05
相关资源
最近更新 更多