Python 如何在pandas中按小时构造本地化的datetime列

Python 如何在pandas中按小时构造本地化的datetime列,python,pandas,datetime,timezone,truncate,Python,Pandas,Datetime,Timezone,Truncate,我想在python中将本地化的datetime列截断/舍入为小时。例如,如果我有2017-10-15 15:03:25+02:00,我希望获得2017-10-15 15:00:00+02:00。请注意,我希望保留时区信息。 我尝试过的第一件事是: DF['dtColumn'].dt.floor('H') 这种方法可以将时间截短到小时,并保留时区信息,问题出现在dst日,例如2017-10-29。给定以下代码: dt1 = datetime.datetime(2017,10,29,0,1) dt

我想在python中将本地化的datetime列截断/舍入为小时。例如,如果我有2017-10-15 15:03:25+02:00,我希望获得2017-10-15 15:00:00+02:00。请注意,我希望保留时区信息。 我尝试过的第一件事是:

DF['dtColumn'].dt.floor('H')
这种方法可以将时间截短到小时,并保留时区信息,问题出现在dst日,例如2017-10-29。给定以下代码:

dt1 = datetime.datetime(2017,10,29,0,1)
dt2 = datetime.datetime(2017,10,29,1,1)
df = pd.DataFrame([('whatever', dt1),('whatever',dt2)])
df[1] = df[1].dt.tz_localize('UTC').dt.tz_convert('Europe/Madrid')
df[1].dt.floor('H')
它会产生给定的错误:

    Traceback (most recent call last):
  File "C:\Python27\lib\site-packages\IPython\core\interactiveshell.py", line 2882, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-90-8319339cf020>", line 5, in <module>
    df[1].dt.floor('H')
  File "C:\Python27\lib\site-packages\pandas\core\base.py", line 210, in f
    return self._delegate_method(name, *args, **kwargs)
  File "C:\Python27\lib\site-packages\pandas\tseries\common.py", line 132, in _delegate_method
    result = method(*args, **kwargs)
  File "C:\Python27\lib\site-packages\pandas\tseries\base.py", line 101, in floor
    return self._round(freq, np.floor)
  File "C:\Python27\lib\site-packages\pandas\tseries\base.py", line 93, in _round
    self._shallow_copy(result, **attribs))
  File "C:\Python27\lib\site-packages\pandas\tseries\base.py", line 213, in _ensure_localized
    result = result.tz_localize(self.tz)
  File "C:\Python27\lib\site-packages\pandas\util\decorators.py", line 91, in wrapper
    return func(*args, **kwargs)
  File "C:\Python27\lib\site-packages\pandas\tseries\index.py", line 1826, in tz_localize
    errors=errors)
  File "pandas\tslib.pyx", line 4380, in pandas.tslib.tz_localize_to_utc (pandas\tslib.c:75768)
AmbiguousTimeError: Cannot infer dst time from Timestamp('2017-10-29 02:00:00'), try using the 'ambiguous' argument
这证明了我的问题的答案不是将日期时间转换为“utc”或时间戳,而是将它们转换回本地化

python datetime中的本机库有一个方法replace,其中可以替换0的分钟和秒信息,但我在pandas中没有找到类似的datetime列。我想找到一个不同的解决方案来逐行迭代,因为我的数据帧相当大。 根据这些约束条件,如何将pandas中的datetime列截断为小时

df.loc[:, 1].values.astype('<M8[h]')
dt1 = datetime.datetime(2017, 10, 29, 0, 1)
dt2 = datetime.datetime(2017, 10, 29, 1, 1)
df = pd.DataFrame([('whatever', dt1), ('whatever', dt2)])
df[1] = df[1].dt.tz_localize('Asia/Katmandu')
df[2] = df.loc[:, 1].values.astype('<M8[h]')
df[2].dt.tz_localize('UTC').dt.tz_convert('Asia/Katmandu')
0   2017-10-28 23:45:00+05:45
1   2017-10-29 00:45:00+05:45
Name: 2, dtype: datetime64[ns, Asia/Katmandu]