我有这样一个数据框,其中包含两列时间戳:
In [12]: df = pd.DataFrame({"start_time": range(1380805471, 1380805481), "end_time" : range(1380805481, 1380805491)})
In [13]: df.ix[:,['start_time','end_time']]
Out[13]:
start_time end_time
0 1380805471 1380805481
1 1380805472 1380805482
2 1380805473 1380805483
3 1380805474 1380805484
4 1380805475 1380805485
5 1380805476 1380805486
6 1380805477 1380805487
7 1380805478 1380805488
8 1380805479 1380805489
9 1380805480 1380805490
我想将这些时间戳转换为人类可读的时间进行显示。目前,我正在使用以下方法:
In [15]: import datetime as dt
In [16]: df['start_time'] = [dt.datetime.fromtimestamp(t) for t in df.start_time]
In [17]: df['end_time'] = [dt.datetime.fromtimestamp(t) for t in df.end_time]
In [18]: df.ix[:,['start_time','end_time']]
Out[18]:
start_time end_time
0 2013-10-03 18:34:31 2013-10-03 18:34:41
1 2013-10-03 18:34:32 2013-10-03 18:34:42
2 2013-10-03 18:34:33 2013-10-03 18:34:43
3 2013-10-03 18:34:34 2013-10-03 18:34:44
4 2013-10-03 18:34:35 2013-10-03 18:34:45
5 2013-10-03 18:34:36 2013-10-03 18:34:46
6 2013-10-03 18:34:37 2013-10-03 18:34:47
7 2013-10-03 18:34:38 2013-10-03 18:34:48
8 2013-10-03 18:34:39 2013-10-03 18:34:49
9 2013-10-03 18:34:40 2013-10-03 18:34:50
我的问题是,是否有专门的 pandas 方法可以做到这一点,而不需要使用列表推导式?或者,除了使用 DateTimeIndex
和 localize
方法将列转换为所需时区之外,还有没有其他方法可以处理时间戳?
2、解决方案
- 使用
pd.to_datetime
函数
你可以使用 pd.to_datetime
函数将时间戳值转换为日期时间对象。
df['start_time'] = pd.to_datetime(df['start_time'], unit='s')
df['end_time'] = pd.to_datetime(df['end_time'], unit='s')
这将返回一个新的数据框,其中包含两个日期时间列。
In [6]: df
Out[6]:
end_time start_time
0 2013-10-03 13:04:41 2013-10-03 13:04:41
1 2013-10-03 13:04:42 2013-10-03 13:04:42
2 2013-10-03 13:04:43 2013-10-03 13:04:43
3 2013-10-03 13:04:44 2013-10-03 13:04:44
4 2013-10-03 13:04:45 2013-10-03 13:04:45
5 2013-10-03 13:04:46 2013-10-03 13:04:46
6 2013-10-03 13:04:47 2013-10-03 13:04:47
7 2013-10-03 13:04:48 2013-10-03 13:04:48
8 2013-10-03 13:04:49 2013-10-03 13:04:49
9 2013-10-03 13:04:50 2013-10-03 13:04:50
你可以在数据框上调用 dt
属性来访问日期时间对象的属性和方法。例如,你可以使用 dt.hour
属性来获取小时。
df['start_time'].dt.hour
Out[7]:
0 13
1 13
2 13
3 13
4 13
5 13
6 13
7 13
8 13
9 13
Name: start_time, dtype: int64
- 使用
apply
函数
你也可以使用 apply
函数来将函数应用到数据框的每一行。例如,你可以使用以下代码将 datetime.fromtimestamp
函数应用到 start_time
列的每一行。
df['start_time'] = df['start_time'].apply(lambda x: dt.datetime.fromtimestamp(x))
这将返回一个新的数据框,其中包含一个日期时间列。
In [6]: df
Out[6]:
start_time end_time
0 2013-10-03 18:34:31+00:00 2013-10-03 18:34:41+00:00
1 2013-10-03 18:34:32+00:00 2013-10-03 18:34:42+00:00
2 2013-10-03 18:34:33+00:00 2013-10-03 18:34:43+00:00
3 2013-10-03 18:34:34+00:00 2013-10-03 18:34:44+00:00
4 2013-10-03 18:34:35+00:00 2013-1