Python:datetime64范围问题

3 投票
2 回答
623 浏览
提问于 2025-04-17 21:13

我正在尝试在两个时间区间之间创建一个以秒为单位的向量:

import numpy as np
import pandas as pd    
date="2011-01-10"
start=np.datetime64(date+'T09:30:00')
end=np.datetime64(date+'T16:00:00')
range = pd.date_range(start, end, freq='S')

但是当我用 print range 打印出来时,得到的结果是:

[2011-01-10 17:30:00, ..., 2011-01-11 00:00:00]

结果的长度是23401,这正是我想要的,但时间区间显然不正确。这是为什么呢?

另外,如果我有一个名为 df 的数据框,其中有一列是datetime64格式,看起来像这样:

Time
15:59:57.887529007
15:59:57.805383290

一旦我解决了上面的问题,我能否这样做:

data = df.reindex(df.Time + range) data = data.ffill() ??

我需要按照这里提到的确切步骤 进行操作,只是要用 datetime64 格式。这样做可行吗?

2 个回答

2

这是因为当你把日期时间写成字符串时,numpy会认为这是本地时间,然后把它转换成UTC时间。

如果你指定了时间的偏移量,虽然这个时间间隔是UTC的,但它会给你正确的时间段。

start=np.datetime64(date+'T09:30:00+0000')
end=np.datetime64(date+'T16:00:00+0000')
range=pd.date_range(start,end,freq='S')

或者你可以使用datetime.datetime对象来作为开始和结束时间,这里的时间间隔同样是UTC的。

import datetime
start = datetime.datetime(2011, 1, 10, 9, 30, 0)
end = datetime.datetime(2011, 1, 10, 16, 0, 0)
range=pd.date_range(start,end,freq='S')
3

看起来 pandas 的 date_range 功能在处理时区时出现了问题(我觉得这可能是个bug,已经有人提出来了...)。你可以用 Timestamp 来代替 datetime64,这样可以绕过这个问题:

In [11]: start = pd.Timestamp(date+'T09:30:00')

In [12]: end = pd.Timestamp(date+'T16:00:00')

In [13]: pd.date_range(start, end, freq='S')
Out[13]: 
<class 'pandas.tseries.index.DatetimeIndex'>
[2011-01-10 09:30:00, ..., 2011-01-10 16:00:00]
Length: 23401, Freq: S, Timezone: None

注意:如果你想知道这是个时区问题,你在 UTC-8 时区,14:00 加上 8:00 就等于第二天的 00:00。

撰写回答