我刚接触熊猫,现在遇到了障碍。我有一个包含时间戳的数据帧。我想在数据框中添加一列,其中将包含自定义的期间名称(字符串)。例如:

df = pd.DataFrame(pd.date_range('01-01 00:00', periods='72', freq='H'))


我想创建一个包含自定义期间名称的列df['Periods']。例如,如果时间戳在Period101-01 00:00之间,则为01-02 00:00,否则为Period2

我当时在考虑使用cut,但是bins属性似乎只使用整数。

你会怎么做?

谢谢。

最佳答案

在您的df初始化中,periods必须是数字而不是字符串。

我想如何处理此问题的方法将取决于您要拥有多少个时期。

至少有两种方法:

设置期:

from datetime import time

morning_start = time(7)
morning_end = time(12)
evening_start = time(18)
evening_end = time(22)

periods = {'morning':[morning_start, morning_end], 'evening':[evening_start, evening_end]}


方法1。

def f(x, periods=periods):
    for k, v in periods.items():
        if x.hour >= v[0].hour and x.hour < v[1].hour:
            return k
    return 'unknown_period'


方法2。

for k, v in periods.items():
    df['periods'] = np.where(((v[0].hour <= df.t.apply(lambda x: x.hour)) & (df.t.apply(lambda x: x.hour) <= v[1].hour)), k, 'unknown_period')


在定义了两个期间之后,第一种方法的工作速度更快:

1000 loops, best of 3: 658 µs per loop


与第二名:

100 loops, best of 3: 3.31 ms per loop


在两种情况下,只有两个句点就可以使其成为单行表达式(无需循环遍历periods):

df['periods'] = np.where((morning_start.hour <= df.t.apply(lambda x: x.hour)) & (df.t.apply(lambda x: x.hour) <= morning_end.hour), 'morning', 'evening')

关于python - 将时间戳记到自定义期间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26659637/

10-12 22:26