将时间戳列拆分为单独的日期和时间列

Tom*_*Tom 21 python pandas

我有一个超过1000个时间戳(下面)的pandas数据帧,我想循环遍历:

2016-02-22 14:59:44.561776
Run Code Online (Sandbox Code Playgroud)

我很难将这个时间戳分成两列 - '日期'和'时间'.日期格式可以保持不变,但需要将时间转换为CST(包括毫秒).

谢谢您的帮助

Ale*_*der 20

我不确定你为什么要首先这样做,但如果你真的必须......

df = pd.DataFrame({'my_timestamp': pd.date_range('2016-1-1 15:00', periods=5)})

>>> df
         my_timestamp
0 2016-01-01 15:00:00
1 2016-01-02 15:00:00
2 2016-01-03 15:00:00
3 2016-01-04 15:00:00
4 2016-01-05 15:00:00

df['new_date'] = [d.date() for d in df['my_timestamp']]
df['new_time'] = [d.time() for d in df['my_timestamp']]

>>> df
         my_timestamp    new_date  new_time
0 2016-01-01 15:00:00  2016-01-01  15:00:00
1 2016-01-02 15:00:00  2016-01-02  15:00:00
2 2016-01-03 15:00:00  2016-01-03  15:00:00
3 2016-01-04 15:00:00  2016-01-04  15:00:00
4 2016-01-05 15:00:00  2016-01-05  15:00:00
Run Code Online (Sandbox Code Playgroud)

转换为CST更加棘手.我假设当前的时间戳是'不知道',即它们没有附加时区?如果没有,您希望如何转换它们?

更多细节:

https://docs.python.org/2/library/datetime.html

如何在python中识别未知的日期时区时区

编辑

另一种方法,只在时间戳上循环一次而不是两次:

new_dates, new_times = zip(*[(d.date(), d.time()) for d in df['my_timestamp']])
df = df.assign(new_date=new_dates, new_time=new_times)
Run Code Online (Sandbox Code Playgroud)

  • 这意味着您的数据被格式化为字符串而不是时间戳。尝试`pd.to_datetime(df.my_timestamp)` 看看它是否正确转换。 (2认同)

Ant*_*pov 12

我认为最简单的方法是使用dtpandas Series的属性.对于您的情况,您需要使用dt.datedt.time:

df = pd.DataFrame({'full_date': pd.date_range('2016-1-1 10:00:00.123', periods=10, freq='5H')})
df['date'] = df['full_date'].dt.date
df['time'] = df['full_date'].dt.time

In [166]: df
Out[166]:
                full_date        date             time
0 2016-01-01 10:00:00.123  2016-01-01  10:00:00.123000
1 2016-01-01 15:00:00.123  2016-01-01  15:00:00.123000
2 2016-01-01 20:00:00.123  2016-01-01  20:00:00.123000
3 2016-01-02 01:00:00.123  2016-01-02  01:00:00.123000
4 2016-01-02 06:00:00.123  2016-01-02  06:00:00.123000
5 2016-01-02 11:00:00.123  2016-01-02  11:00:00.123000
6 2016-01-02 16:00:00.123  2016-01-02  16:00:00.123000
7 2016-01-02 21:00:00.123  2016-01-02  21:00:00.123000
8 2016-01-03 02:00:00.123  2016-01-03  02:00:00.123000
9 2016-01-03 07:00:00.123  2016-01-03  07:00:00.123000
Run Code Online (Sandbox Code Playgroud)

  • 上述(虽然简单而优雅)解决方案的一个警告是,新的日期列现在是"对象"类型而不是datetime64.df ['full_date'].dt.normalize()保留datetime64格式,这可能会有所帮助. (4认同)

Nod*_*ili 11

有同样的问题,这对我有用.

假设数据集中的日期列称为"日期"

import pandas as pd
df = pd.read_csv(file_path)

df['Dates'] = pd.to_datetime(df['date']).dt.date
df['Time'] = pd.to_datetime(df['date']).dt.time
Run Code Online (Sandbox Code Playgroud)

这将为您提供两列"日期"和"时间"以及分割日期.

  • 这对我有用,谢谢!我也不喜欢另一位发帖人的居高临下的评论,问“你为什么首先要这样做”。有人可能需要在他们的代码中这样做的原因有很多! (6认同)