python - Pandas,根据数据间隔创建列值

标签 python pandas datetime

我对 python 相当陌生,并且有一个包含数据的 panda,需要根据获取时间进行标记。 panda 有一个时间戳列,包含 datetime64 类型的时间戳。

我想评估列中的所有值,并测试它们是否在特定时间范围内,并根据日期所属的时间间隔在新列中分配标签 1-5。

timestamp:             interval:
2017-03-22 13:12:00     1
2017-03-23 13:12:00     1
2017-03-24 13:12:00     2
2017-03-25 13:12:00     2
2017-03-26 13:12:00     2

我尝试了一个函数,可以使用如下所示的数据框调用

def classifyRunHours(series):
    if [(series['index_time'] > PERIOD_1) & (series['index_time'] <= PERIOD_2)]:
        return 1
    elif [(series['index_time'] > PERIOD_2) & (series['index_time'] <= PERIOD_3)]:
        return 2
    elif [(series['index_time'] > PERIOD_3) & (series['index_time'] <= PERIOD_4)]:
        return 3
    elif [(series['index_time'] > PERIOD_4) & (series['index_time'] <= PERIOD_5)]:
        return 4
    else:
        return 0

并且间隔定义为

PERIOD_1 = '2017-05-20 11:00:00'

这给我带来了一些麻烦,因为我正在比较字符串和时间戳。 这可能是可以解决的,但我不确定这是否是在专栏上工作的正确方法。我应该使用 lambda 函数来处理整个列吗?或者如何有效地做到这一点

欢迎任何意见

最佳答案

我认为你需要cut + add_categoriesfillna用于替换 NaN:

rng = pd.date_range('2017-04-03', periods=15)
series = pd.DataFrame({'index_time': rng, 'a': range(15)})  

PERIOD_1 = '2017-04-05'
PERIOD_2 = '2017-04-08'
PERIOD_3 = '2017-04-10'
PERIOD_4 = '2017-04-11'
PERIOD_5 = '2017-04-13'

bins = pd.DatetimeIndex([PERIOD_1,PERIOD_2,PERIOD_3,PERIOD_4, PERIOD_5])
labels = [1,2,3,4]
series['interval'] = pd.cut(series['index_time'], bins=bins, labels=labels)
series['interval'] = series['interval'].cat.add_categories([0]).fillna(0)
print (series)
     a index_time interval
0    0 2017-04-03        0
1    1 2017-04-04        0
2    2 2017-04-05        0
3    3 2017-04-06        1
4    4 2017-04-07        1
5    5 2017-04-08        1
6    6 2017-04-09        2
7    7 2017-04-10        2
8    8 2017-04-11        3
9    9 2017-04-12        4
10  10 2017-04-13        4
11  11 2017-04-14        0
12  12 2017-04-15        0
13  13 2017-04-16        0
14  14 2017-04-17        0

另一个解决方案 searchsorted :

bins = pd.DatetimeIndex(['1678-01-01',PERIOD_1,PERIOD_2,PERIOD_3,PERIOD_4, PERIOD_5, '2226-01-01'])
labels = [0,1,2,3,4,0]
series['interval'] = np.array(labels)[np.array(bins).searchsorted(series['index_time'].values) - 1]
print (series)
     a index_time  interval
0    0 2017-04-03         0
1    1 2017-04-04         0
2    2 2017-04-05         0
3    3 2017-04-06         1
4    4 2017-04-07         1
5    5 2017-04-08         1
6    6 2017-04-09         2
7    7 2017-04-10         2
8    8 2017-04-11         3
9    9 2017-04-12         4
10  10 2017-04-13         4
11  11 2017-04-14         0
12  12 2017-04-15         0
13  13 2017-04-16         0
14  14 2017-04-17         0

关于python - Pandas,根据数据间隔创建列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46976410/

相关文章:

python - 为什么 Pandas 会错误地评估一年中最后一天的周数?

mysql - 使用 mySQL 将时间舍入到最接近的 6 分钟

python - 如何在 python 2 中通过线程充分利用 CPU 内核

python - 使用检查将参数传递给Python中的函数

python - 用上一个/下一个值 +- 100 填充 Na 的列

python - 合并 2 个字典并将它们存储在 pandas 数据框中,其中一个字典具有可变长度列表元素

python - 类装饰器与函数装饰器

python - ModuleNotFoundError : No module named 'pandas.io.formats.csvs'

javascript - 从列中获取日期列表并将其格式化为 MM/dd/yyyy

python - 将 HH :MM:SS. 微字符串转换为微秒?