如何在 pandas 中设置 datetime floor 操作的基数?
How to set the base of a datetime floor operation in pandas?
我想重新分配一系列日期的时间戳,以便它们以(例如)3 天的频率下降:
import pandas as pd
x = pd.date_range('01-01-2019', freq='1D', periods=7).floor('3D')
y = pd.date_range('01-01-2022', freq='1D', periods=7).floor('3D')
我希望“floor”与第一个日期对齐并产生:
In[3]: x
Out[3]:
DatetimeIndex(['2019-01-01', '2019-01-01', '2019-01-01', '2019-01-04',
'2019-01-04', '2019-01-04', '2019-01-07'],
dtype='datetime64[ns]', freq=None)
In[4]: y
Out[4]:
DatetimeIndex(['2022-01-01', '2022-01-01', '2022-01-01', '2022-01-04',
'2022-01-04', '2022-01-04', '2022-01-07'],
dtype='datetime64[ns]', freq=None)
但似乎有一个 3 天的周期,日期被限制为(大概是自 1970 年 1 月 1 日以来 3 天的倍数?),所以结果是:
In[3]: x
Out[3]:
DatetimeIndex(['2018-12-30', '2019-01-02', '2019-01-02', '2019-01-02',
'2019-01-05', '2019-01-05', '2019-01-05'],
dtype='datetime64[ns]', freq=None)
In[4]: y
Out[4]:
DatetimeIndex(['2022-01-01', '2022-01-01', '2022-01-01', '2022-01-04',
'2022-01-04', '2022-01-04', '2022-01-07'],
dtype='datetime64[ns]', freq=None)
x
的结果从 12 月 30 日开始,而不是 1 月 1 日。
有没有办法为 pandas 中的 floor
操作设置一个“基数”? 我说“基数”是因为 [= resample
中的 16=] 参数用于进行类似的调整。但我不想做任何聚合,只保留每个元素但重新分配时间戳。
x = pd.date_range('01-01-2019', freq='1D', periods=7)
y = pd.date_range('01-01-2022', freq='1D', periods=7)
def floor(x, freq):
offset = x[0].ceil(freq) - x[0]
return (x + offset).floor(freq) - offset
print(floor(x, '3D'))
print(floor(y, '3D'))
输出
DatetimeIndex(['2019-01-01', '2019-01-01', '2019-01-01', '2019-01-04',
'2019-01-04', '2019-01-04', '2019-01-07'],
dtype='datetime64[ns]', freq=None)
DatetimeIndex(['2022-01-01', '2022-01-01', '2022-01-01', '2022-01-04',
'2022-01-04', '2022-01-04', '2022-01-07'],
dtype='datetime64[ns]', freq=None)
添加加法逻辑:
def floor(x, freq):
offset = x[0].ceil(freq) - x[0]
adj_needed = (offset != pd.Timedelta(0))
return (x + offset).floor(freq) - offset if adj_needed else x.floor(freq)
我想重新分配一系列日期的时间戳,以便它们以(例如)3 天的频率下降:
import pandas as pd
x = pd.date_range('01-01-2019', freq='1D', periods=7).floor('3D')
y = pd.date_range('01-01-2022', freq='1D', periods=7).floor('3D')
我希望“floor”与第一个日期对齐并产生:
In[3]: x
Out[3]:
DatetimeIndex(['2019-01-01', '2019-01-01', '2019-01-01', '2019-01-04',
'2019-01-04', '2019-01-04', '2019-01-07'],
dtype='datetime64[ns]', freq=None)
In[4]: y
Out[4]:
DatetimeIndex(['2022-01-01', '2022-01-01', '2022-01-01', '2022-01-04',
'2022-01-04', '2022-01-04', '2022-01-07'],
dtype='datetime64[ns]', freq=None)
但似乎有一个 3 天的周期,日期被限制为(大概是自 1970 年 1 月 1 日以来 3 天的倍数?),所以结果是:
In[3]: x
Out[3]:
DatetimeIndex(['2018-12-30', '2019-01-02', '2019-01-02', '2019-01-02',
'2019-01-05', '2019-01-05', '2019-01-05'],
dtype='datetime64[ns]', freq=None)
In[4]: y
Out[4]:
DatetimeIndex(['2022-01-01', '2022-01-01', '2022-01-01', '2022-01-04',
'2022-01-04', '2022-01-04', '2022-01-07'],
dtype='datetime64[ns]', freq=None)
x
的结果从 12 月 30 日开始,而不是 1 月 1 日。
有没有办法为 pandas 中的 floor
操作设置一个“基数”? 我说“基数”是因为 [= resample
中的 16=] 参数用于进行类似的调整。但我不想做任何聚合,只保留每个元素但重新分配时间戳。
x = pd.date_range('01-01-2019', freq='1D', periods=7)
y = pd.date_range('01-01-2022', freq='1D', periods=7)
def floor(x, freq):
offset = x[0].ceil(freq) - x[0]
return (x + offset).floor(freq) - offset
print(floor(x, '3D'))
print(floor(y, '3D'))
输出
DatetimeIndex(['2019-01-01', '2019-01-01', '2019-01-01', '2019-01-04',
'2019-01-04', '2019-01-04', '2019-01-07'],
dtype='datetime64[ns]', freq=None)
DatetimeIndex(['2022-01-01', '2022-01-01', '2022-01-01', '2022-01-04',
'2022-01-04', '2022-01-04', '2022-01-07'],
dtype='datetime64[ns]', freq=None)
添加加法逻辑:
def floor(x, freq):
offset = x[0].ceil(freq) - x[0]
adj_needed = (offset != pd.Timedelta(0))
return (x + offset).floor(freq) - offset if adj_needed else x.floor(freq)