我有一个带有两列时间戳的数据框:
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
第二步是在start_time之前显示start_time,否则按字母顺序显示列只有df
。
现在,我想将这些时间戳转换为人类可读时间以供显示。目前,我正在做::
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
我的问题 - 是否有任何熊猫特定的方法,这不需要使用列表推导或这是唯一的方法?
另一方面,我知道,处理时间戳的方法是使用DateTimeIndex,然后使用localize方法转换为所需的时区。但是这种方式要求您将列作为索引,因此,只能对一列进行。如果我对DateTimeIndex的理解是错误的,请纠正我。另外,我不要求这些列是索引。
那么使用pandas还有更好的方法吗?
更新
In [52]: df['start_time'] = pd.DatetimeIndex(pd.to_datetime(df['start_time'],unit='s'),tz='UTC').tz_convert('Asia/Kolkata')
In [53]: df
Out[53]:
end_time start_time
0 1380805481 2013-10-03 13:04:31
1 1380805482 2013-10-03 13:04:32
2 1380805483 2013-10-03 13:04:33
3 1380805484 2013-10-03 13:04:34
4 1380805485 2013-10-03 13:04:35
5 1380805486 2013-10-03 13:04:36
6 1380805487 2013-10-03 13:04:37
7 1380805488 2013-10-03 13:04:38
8 1380805489 2013-10-03 13:04:39
9 1380805490 2013-10-03 13:04:40
即使在指定'亚洲/加尔各答'作为论据之后,我仍然需要GMT + 5.30。我错过了什么吗?
我需要转换两列以在本地时区显示时间。 DateTimeIndex的结果只有在我将其设置为索引时才可见。
In [55]: t = pd.DatetimeIndex(pd.to_datetime(df['start_time'],unit='s'),tz='UTC').tz_convert('Asia/Kolkata')
In [59]: df.set_index(t, inplace=True)
In [60]: df
Out[60]:
end_time start_time
2013-10-03 18:34:31+05:30 1380805481 2013-10-03 13:04:31
2013-10-03 18:34:32+05:30 1380805482 2013-10-03 13:04:32
2013-10-03 18:34:33+05:30 1380805483 2013-10-03 13:04:33
2013-10-03 18:34:34+05:30 1380805484 2013-10-03 13:04:34
2013-10-03 18:34:35+05:30 1380805485 2013-10-03 13:04:35
2013-10-03 18:34:36+05:30 1380805486 2013-10-03 13:04:36
2013-10-03 18:34:37+05:30 1380805487 2013-10-03 13:04:37
2013-10-03 18:34:38+05:30 1380805488 2013-10-03 13:04:38
2013-10-03 18:34:39+05:30 1380805489 2013-10-03 13:04:39
2013-10-03 18:34:40+05:30 1380805490 2013-10-03 13:04:40
我应该如何为两个列做到这一点?
答案 0 :(得分:4)
这是在0.12中引入的。它在cython中完成的速度要快得多。那个单位 是纪元秒数(如果你的日期时间是以纪元为单位的毫秒数,你也可以传递'ms')。 docs here
In [6]: df['end_time'] = pd.to_datetime(df['end_time'],unit='s')
In [7]: df['start_time'] = pd.to_datetime(df['end_time'],unit='s')
In [8]: df
Out[8]:
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
请注意,这已经是GMT了。 datetime.fromtimestamp
转换为本地tz)。如果你想要那个。
In [21]: DatetimeIndex(pd.to_datetime(df['end_time'],unit='s'),tz='UTC').tz_convert('EST')
Out[21]:
<class 'pandas.tseries.index.DatetimeIndex'>
[2013-10-03 08:04:41, ..., 2013-10-03 08:04:50]
Length: 10, Freq: None, Timezone: EST
In [32]: DataFrame(dict(end_time = DatetimeIndex(pd.to_datetime(df['end_time'],unit='s'),tz='UTC').tz_convert('Asia/Kolkata').asobject))
转换为亚洲/加尔各答的tz。你必须将其表示为对象。这样可行。
end_time
0 2013-10-03 18:34:41+05:30
1 2013-10-03 18:34:42+05:30
2 2013-10-03 18:34:43+05:30
3 2013-10-03 18:34:44+05:30
4 2013-10-03 18:34:45+05:30
5 2013-10-03 18:34:46+05:30
6 2013-10-03 18:34:47+05:30
7 2013-10-03 18:34:48+05:30
8 2013-10-03 18:34:49+05:30
9 2013-10-03 18:34:50+05:30
答案 1 :(得分:1)
使用apply
df['start_time'] = df['start_time'].apply(lambda x: dt.datetime.fromtimestamp(x))
df['end_time'] = df['end_time'].apply(lambda x: dt.datetime.fromtimestamp(x))
这将实现你想要的目标