在 pandas 的 to_datetime 函数中使用时区

72

我有从epoch时间戳转换而来的时间。我使用data.Time_req = pd.to_datetime(data.Time_req),但是我得到的是UTC时间,我需要在给定的时间上加上+5:30。我该如何告诉Pandas使用'IST'时区或者在当前显示的时间上再加5小时30分钟,例如:7小时应变为12:30小时等等。

4个回答

146

您可以使用tz_localize将时区设置为UTC/+0000,然后使用tz_convert添加所需的时区:

start = pd.to_datetime('2015-02-24')
rng = pd.date_range(start, periods=10)

df = pd.DataFrame({'Date': rng, 'a': range(10)})  

df.Date = df.Date.dt.tz_localize('UTC').dt.tz_convert('Asia/Kolkata')
print (df)
                       Date  a
0 2015-02-24 05:30:00+05:30  0
1 2015-02-25 05:30:00+05:30  1
2 2015-02-26 05:30:00+05:30  2
3 2015-02-27 05:30:00+05:30  3
4 2015-02-28 05:30:00+05:30  4
5 2015-03-01 05:30:00+05:30  5
6 2015-03-02 05:30:00+05:30  6
7 2015-03-03 05:30:00+05:30  7
8 2015-03-04 05:30:00+05:30  8
9 2015-03-05 05:30:00+05:30  9

处理时区

仅需添加Timedelta

df.Date = df.Date + pd.Timedelta('05:30:00')
print (df)
                 Date  a
0 2015-02-24 05:30:00  0
1 2015-02-25 05:30:00  1
2 2015-02-26 05:30:00  2
3 2015-02-27 05:30:00  3
4 2015-02-28 05:30:00  4
5 2015-03-01 05:30:00  5
6 2015-03-02 05:30:00  6
7 2015-03-03 05:30:00  7
8 2015-03-04 05:30:00  8
9 2015-03-05 05:30:00  9

注意:添加Timedelta将更改与datetime对象相关联的纪元时间戳。这对于许多应用程序可能不是所期望的。


9
可通过执行pytz.all_timezones命令找到可用的时区。 - grnc

6

从Unix纪元时间戳转换

timestamps = [1656285319, 1656285336, 1656285424]

pd.to_datetime(timestamps, unit='s', utc=True).map(lambda x: x.tz_convert('Asia/Kolkata'))

输出:

DatetimeIndex(['2022-06-27 04:45:19+05:30', '2022-06-27 04:45:36+05:30',
               '2022-06-27 04:47:04+05:30'],
              dtype='datetime64[ns, Asia/Kolkata]', freq=None)

所有时区

import pytz
pytz.all_timezones

完整列表在此处


4
以下方法适用于我:
df['Local_Time'] = pd.to_datetime(df,unit='s', utc=True)\
                      .map(lambda x: x.tz_convert('America/Chicago'))

这是pytz中时区名称列表。
希望能对某些人有所帮助!

2

这些.map建议导致了pandas to_datetime 'Timestamp'对象没有'map'属性的错误。

在我的情况下有效的方法是:

df.insert(0, 'uploadtimestamp', pd.to_datetime('now').replace(microsecond=0))

df['uploadtimestamp'] = df['uploadtimestamp'].dt.tz_localize('UTC').dt.tz_convert('US/Eastern')

或者

df.insert(0, 'uploadtimestamp',pd.to_datetime('now').replace(microsecond=0))

df['uploadtimestamp'] = df['uploadtimestamp'].dt.tz_localize('UTC').dt.tz_convert('US/Eastern').apply(lambda x: x.strftime('%Y-%m-%d %H:%M:%S'))

如果想让时间戳列变成字符串。


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