【问题标题】:Converting multiple columns with timestamp values to GMT time without using DateTimeIndex in pandas将具有时间戳值的多列转换为 GMT 时间而不在​​ Pandas 中使用 DateTimeIndex
【发布时间】:2013-10-03 13:29:24
【问题描述】:

我有一个包含两列时间戳的数据框:

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 显示在 end_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

我的问题 - 是否有任何不需要使用列表推导的 pandas 特定方法或者这是唯一的方法?

据我所知,处理时间戳的另一种方法是使用 DateTimeIndex,然后使用本地化方法转换为所需的时区。但是这种方式要求您将该列设为索引,因此,可以只为一列完成。如果我对 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 时间,而我想要 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

我应该如何对两列进行处理?

【问题讨论】:

  • 您可以直接使用apply 并像df['start_time'] = df['start_time'].apply(lambda x: dt.datetime.fromtimestamp(x)) 那样直接分配给列,这比列表理解要好

标签: python timestamp pandas


【解决方案1】:

这是在 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

请注意,这已经是格林威治标准时间了。 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

【讨论】:

  • @Jeff 这有效,但即使将时区指定为参数,转换后的时间也不在本地时区。请参阅上面的更新。
【解决方案2】:

使用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))

这将实现你想要的

【讨论】:

  • 这也很有帮助。谢谢!
猜你喜欢
  • 1970-01-01
  • 2012-10-12
  • 2022-11-21
  • 2020-08-06
  • 1970-01-01
  • 2018-03-07
  • 2016-11-12
  • 2012-07-15
  • 1970-01-01
相关资源
最近更新 更多