我在数据帧中有以下内容:
> df['timestamps'].loc[0]
Timestamp('2014-09-02 20:24:00')
我知道它使用的时区(我认为是GMT),并希望将整列转换为EST。我怎么能在熊猫身上做到这一点?
作为参考,我发现了以下其他线程:
- 将unix时间戳更改为其他时区
- Pandas:在GMT中从CSV读取时间戳,然后重新采样
但是它们使用CCD_ 1时间戳。例如:
> datetime.datetime.fromtimestamp(df['timestamps'].loc[0], tz=None)
returns:
TypeError Traceback (most recent call last)
----> 2 datetime.datetime.fromtimestamp(ts, tz=None)
TypeError: an integer is required (got type Timestamp)
只需使用tz_convert
方法。
假设您有一个时间戳对象:
stamp = Timestamp('1/1/2014 16:20', tz='America/Sao_Paulo')
new_stamp = stamp.tz_convert('US/Eastern')
如果您有兴趣转换日期范围:
range = date_range('1/1/2014', '1/1/2015', freq='S', tz='America/Sao_Paulo')
new_range = range.tz_convert('US/Eastern')
对于大型时间序列:
import numpy as np
ts = Series(np.random.randn(len(range)), range)
new_ts = ts.tz_convert('US/Eastern')
如另一个答案所述,如果您的数据没有设置时区,则需要tz_localize
it:
data.tz_localize('utc')
日期时间的fromtimestamp实际上来自POSIX时间戳,即1970-1-1 GMT 的ms
In [11]: datetime.datetime.fromtimestamp?
Type: builtin_function_or_method
String form: <built-in method fromtimestamp of type object at 0x101d90500>
Docstring: timestamp[, tz] -> tz's local time from POSIX timestamp.
In [12]: datetime.datetime.fromtimestamp(0)
Out[12]: datetime.datetime(1969, 12, 31, 16, 0)
In [13]: datetime.datetime.fromtimestamp(1)
Out[13]: datetime.datetime(1969, 12, 31, 16, 0, 1)
我认为这可能是一个问题,因为我在太平洋标准时间时区
这与熊猫的时间戳不同(尽管在1970-1-1年的时间戳下)。
In [21]: pd.Timestamp(0)
Out[21]: Timestamp('1970-01-01 00:00:00')
要转换Timestamp/datetime64列,请使用tz_convert(如果是tz天真的,即还没有时区,则需要首先进行tz_localize):
In [31]: pd.Timestamp(0).tz_localize('UTC')
Out[31]: Timestamp('1970-01-01 00:00:00+0000', tz='UTC')
In [32]: t = pd.Timestamp(0).tz_localize('UTC')
In [33]: t.tz_convert('US/Eastern')
Out[33]: Timestamp('1969-12-31 19:00:00-0500', tz='US/Eastern')
请参阅文档的时区处理部分
如何将UTC时间(最初来自Unix时间)转换为美国/东方时间的示例。
这是在矢量化模式下运行的,所以速度非常快:数百万行在几秒钟内运行。
在Python 3.9上测试。
df = pd.DataFrame({"timestamp": [Timestamp("2017-01-03 14:30:00.049"), Timestamp("2017-01-03 14:30:00.049"), Timestamp("2017-01-03 14:30:00.049")],
"x": [1,2,3]})
timestamp = df["timestamp"].values
timestamp = pd.to_datetime(timestamp)
timestamp = timestamp.tz_localize("UTC").tz_convert("US/Eastern") # Convert UTC to US/Eastern
timestamp = timestamp.tz_localize(None) # Strip timezone information off.
df["timestamp"] = timestamp.values
df
In:
timestamp x
2017-01-03 14:30:00.049 1
2017-01-03 14:30:00.049 2
2017-01-03 14:30:00.049 3
输出:
timestamp x
2017-01-03 09:30:00.049 1
2017-01-03 09:30:00.049 2
2017-01-03 09:30:00.049 3
奖金
如果列最初以Unix时间(毫秒)为单位,则使用此方法将其强制转换为datetime64[ns]的数组:
timestamp = pd.to_datetime(timestamp, unit="ms")