5

这是一直移动到月底的代码:

import numpy as np
import pandas as pd

times = np.array([
       '2013-07-22T02:10:32.000000000+0900',
       '2013-07-22T01:11:13.000000000+0900',
       '2013-07-21T23:23:32.000000000+0900',
       '2013-07-21T05:59:21.000000000+0900',
       '2013-07-21T05:57:30.000000000+0900',
       '2013-07-21T05:44:27.000000000+0900',
       '2013-07-20T10:45:17.000000000+0900',
       '2013-07-20T10:36:53.000000000+0900',
       '2013-07-20T09:57:46.000000000+0900',
       '2013-07-20T09:57:06.000000000+0900',
       '2013-07-20T09:30:57.000000000+0900',
       '2013-07-20T08:20:27.000000000+0900',], dtype='datetime64[ns]')

dti = pd.DatetimeIndex(times)
dti.shift(1, "M").values

结果是:

array(['2013-07-31T09:00:00.000000000+0900',
       '2013-07-31T09:00:00.000000000+0900',
       '2013-07-31T09:00:00.000000000+0900',
       '2013-07-31T09:00:00.000000000+0900',
       '2013-07-31T09:00:00.000000000+0900',
       '2013-07-31T09:00:00.000000000+0900',
       '2013-07-31T09:00:00.000000000+0900',
       '2013-07-31T09:00:00.000000000+0900',
       '2013-07-31T09:00:00.000000000+0900',
       '2013-07-31T09:00:00.000000000+0900',
       '2013-07-31T09:00:00.000000000+0900',
       '2013-07-31T09:00:00.000000000+0900'], dtype='datetime64[ns]')

但是如何将所有时间移动到小时,一天或一周的结束?

4

2 回答 2

3

我为此找到的最佳方法是to_period& to_timestamp

In [39]:

dti.to_period("W-SAT").to_timestamp(how="end").values

Out[39]:

array(['2013-07-27T09:00:00.000000000+0900',
       '2013-07-27T09:00:00.000000000+0900',
       '2013-07-27T09:00:00.000000000+0900',
       '2013-07-20T09:00:00.000000000+0900',
       '2013-07-20T09:00:00.000000000+0900',
       '2013-07-20T09:00:00.000000000+0900',
       '2013-07-20T09:00:00.000000000+0900',
       '2013-07-20T09:00:00.000000000+0900',
       '2013-07-20T09:00:00.000000000+0900',
       '2013-07-20T09:00:00.000000000+0900',
       '2013-07-20T09:00:00.000000000+0900',
       '2013-07-20T09:00:00.000000000+0900'], dtype='datetime64[ns]')

In [40]:

dti.to_period("H").to_timestamp(how="end").values

Out[40]:

array(['2013-07-22T02:59:59.000000000+0900',
       '2013-07-22T01:59:59.000000000+0900',
       '2013-07-21T23:59:59.000000000+0900',
       '2013-07-21T05:59:59.000000000+0900',
       '2013-07-21T05:59:59.000000000+0900',
       '2013-07-21T05:59:59.000000000+0900',
       '2013-07-20T10:59:59.000000000+0900',
       '2013-07-20T10:59:59.000000000+0900',
       '2013-07-20T09:59:59.000000000+0900',
       '2013-07-20T09:59:59.000000000+0900',
       '2013-07-20T09:59:59.000000000+0900',
       '2013-07-20T08:59:59.000000000+0900'], dtype='datetime64[ns]')
于 2013-07-29T08:10:21.890 回答
1

我同意安迪的观点;这不能是shift. 将时间转移到月底的一种更简洁的方法是:

from pandas.tseries.offsets import MonthEnd
times = Series(times)
times.map(lambda x: x + MonthEnd())

但是没有 HourEnd、DayEnd 或 WeekEnd 这样的东西。对于这些情况,如何遵循这种模式?

from pandas.tseries.offsets import Second, Minute, Hour, Day

times.map(lambda x: x + Minute(59-x.minute) + Second(59-x.second))

times.map(lambda x: x + Hour(23-x.hour) + Minute(59-x.minute) + Second(59-x.second))

times.map(lambda x: x + Day(6-x.weekday()) + Hour(23-x.hour) + \
          Minute(59-x.minute) + Second(59-x.second))

如果你想要一周的最后一天但不一定是那一天的最后一秒,那么表达式显然更简单。

于 2013-07-28T18:14:09.140 回答