如何使用Pandas创建日期时间列,包括年、月、日、小时、分钟和秒?

5

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

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()和辅助函数轻松完成此操作,但我想对数百万行执行此操作。我希望有内置/向量化的功能。谢谢!

也许可以看一下这个链接:https://dev59.com/Mmct5IYBdhLWcg3wvf7J,特别是第三个回答,它比较了不同的列字符串理解方法。 - PeptideWitch
3个回答

8
< p > 据我所知,to_datetime可以接受数据框,但只有在列名与你的相同的情况下才能这样做。

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]

现在正在进行一些测试! - PeptideWitch

2
阅读了这篇关于pandas数据框字符串连接方法的比较后,看起来您可以从使用df.assign中受益。 "Original Answer"翻译成“最初的回答”。
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。

编辑:

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

enter image description here


最初的回答

2
@AndyL。实际上,你说得很对 - OP声明他们想要datetime64作为他们的数据类型,而我的方法只返回字符串。我很抱歉。如果您编辑您的答案(比如,在某个地方添加一个空格),我会取消投票反对它。尽管如此,它仍然比WeNYoBen的方法慢。 - PeptideWitch
我编辑了它。我从未质疑你的速度测试。WeNYoBen的解决方案更好。这就是为什么我给他点赞。 - Andy L.
2
我的哲学是,任何解决方案都值得发帖者付出努力,因此我从不对任何解决方案进行负面评价,即使该解决方案是错误的。对于错误的解决方案,我可能会进行评论,但从不进行负面评价。在这种情况下,我有点失衡。我为我的严厉言辞道歉,并删除了那些评论。请编辑您的评论,以便我可以撤回对您的负面评价。 - Andy L.
2
哦,谢谢。你真好。其实我很喜欢你的哲学......也许在急于得到正确答案的时候,我有点儿自大了,不小心践踏了你的回答。即使措辞有些严厉,对我来说听到自己的错误还是很有用的,所以在这方面不需要道歉 :) - PeptideWitch

2
你可以将整个df转换为str,使用agg来连接字符串,并使用pd.to_datetimeformat参数。"Original Answer"翻译成"最初的回答"。
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]

我在测试时发现这种方法相当慢。它能够工作,但是它是一种比较繁重的方式。 - PeptideWitch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接