【问题标题】:How to create a Pandas column for datetime from year / month/ day / hour / minute / second?如何为年/月/日/小时/分钟/秒的日期时间创建 Pandas 列?
【发布时间】:2019-08-02 08:50:18
【问题描述】:

我正在尝试在 Pandas 中构建一个 datetime 列,该列表示描述年、月、日等的多个列。我可以在该主题上找到的大多数其他答案都涉及以相反方向处理数据(从 datetime 到 integer小时,例如)。

df = pd.DataFrame()

df['year'] = [2019, 2019, 2019, 2019, 2019, 2019]
df['month'] = [8, 8, 8, 8, 8, 8]
df['day'] = [1, 1, 1, 1, 1, 1]
df['hour'] = [10,10,11,11,12,12]
df['minute'] = [15,45,20,40,10,50]
df['second'] = [0, 1, 5, 10, 10, 11]

目标:

df['datetime_val'] = 
0   2019-08-01 10:15:00
1   2019-08-01 10:45:01
2   2019-08-01 11:20:05
3   2019-08-01 11:40:10
4   2019-08-01 12:10:10
5   2019-08-01 12:50:11
Name: datetime_vals, dtype: datetime64[ns]

在上面的示例中,我如何快速创建一个表示构成时间信息的日期时间列?我可以使用 .apply() 和辅助函数轻松完成此操作,但我设想对数百万行执行此操作。我会喜欢一些内置/矢量化的东西。谢谢!

【问题讨论】:

标签: python pandas


【解决方案1】:

IIUC to_datetime 可以采用 dataframe ,前提是列被正确命名为您的列

pd.to_datetime(df)
0   2019-08-01 10:15:00
1   2019-08-01 10:45:01
2   2019-08-01 11:20:05
3   2019-08-01 11:40:10
4   2019-08-01 12:10:10
5   2019-08-01 12:50:11
dtype: datetime64[ns]

【讨论】:

  • 现在做一些测试!
【解决方案2】:

阅读 through this comparison 的 pandas 数据帧的字符串连接方法后,您似乎可以从使用 df.assign 中受益:

df.assign(datetime_val=[f"{str(year)}-{str(month)}-{str(day)} {str(hour)}:{str(minute)}:{str(second)}" for year, month, day, hour, minute, second in zip(df['year'], df['month'], df['day'], df['hour'], df['minute'], df['second'])])

编辑2:

然而,正如 Andy L 所指出的,我的方法不返回 datetime64 对象。事实上,在将字符串换成 datetime 对象时,方法 3 变得异常缓慢。但是,方法 1 与方法 2 的比较仍然有效。

编辑:

做了一些测试来比较这里介绍的三种方法

【讨论】:

  • @AndyL。实际上,公平调用 - OP 表示他们希望 datetime64 作为他们的数据类型,而我的方法只返回字符串。我很抱歉。如果您编辑您的答案(例如,在某处添加一个空格),我将取消投票。尽管如此,它仍然比 WeNYoBen 的方法慢。
  • 我编辑了它。我从不质疑你的速度测试。 WeNYoBen 的解决方案更好。这就是我支持他的原因。
  • 我的理念是任何解决方案总是值得发帖者努力的,所以即使该解决方案是错误的,我也绝不会否决任何解决方案。对于错误的解决方案,我可能会发表评论,但绝不会否决。在这种情况下,我有点失衡。我为我的严厉言论道歉。我删除了那些cmets。请编辑你的,这样我就可以收回我对你的投反对票
  • 哦,谢谢。你真好。我喜欢你的哲学,实际上......也许我急于得到正确的答案,我也因为践踏你的答案而变得有点自大。当我错了的时候听到对我很有用,即使话有点刺耳,所以在这方面不需要道歉:)
【解决方案3】:

您可以将整个df 转换为str 并使用agg 连接字符串并使用format 参数pd.to_datetime

df = df.astype(str)
pd.to_datetime(df.agg('-'.join, axis=1), format='%Y-%m-%d-%H-%M-%S')

Out[170]:
0   2019-08-01 10:15:00
1   2019-08-01 10:45:01
2   2019-08-01 11:20:05
3   2019-08-01 11:40:10
4   2019-08-01 12:10:10
5   2019-08-01 12:50:11
dtype: datetime64[ns]

【讨论】:

  • 我在测试时发现这个方法很慢。它有效,但这是一种相当繁重的方法。
猜你喜欢
  • 1970-01-01
  • 2011-07-26
  • 1970-01-01
  • 2017-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多