【问题标题】:error while bitting timestamps into custom periods将时间戳记入自定义期间时出错
【发布时间】:2015-10-21 11:38:15
【问题描述】:

我试图将时间戳记入自定义期间,我想我使用的方法不是很好,在回答这个问题时提出 Bin timestamp into custom periods 这是我的代码:

def assigne_time():
    morning_start=datetime.time(7)
    morning_end = datetime.time(12)
    noon_start=datetime.time(12)
    noon_end=datetime.time(14)
    afternoon_start=datetime.time(14)
    afternoon_end=datetime.time(18)
    evening_start = datetime.time(18)
    evening_end = datetime.time(23)
    night_start=datetime.time(23)
    night_end=datetime.time(7)
    periods = {'morning':[morning_start, morning_end], 'noon':[noon_start, noon_end],'afternoon':[afternoon_start, afternoon_end],'evening':[evening_start, evening_end], 'night':[night_start, night_end]}
    for k, v in periods.items():
        df['periods'] = np.where(((v[0].hour <= df.Time.apply(lambda x: x.hour)) & (df.Time.apply(lambda x: x.hour) <= v[1].hour)), k, 'unknown_period')
    return df.to_csv('assigne_time.csv', sep='\t')

所以它只分配“早上”时段,而其他人分配“unknown_period”:

05:51:53    2015-05-22  unknown_period
05:52:59    2015-05-22  unknown_period
06:08:24    2015-05-22  unknown_period
06:09:06    2015-05-22  unknown_period
08:25:31    2015-05-22  morning
08:25:35    2015-05-22  morning
08:26:37    2015-05-22  morning
08:27:11    2015-05-22  morning
08:33:17    2015-05-22  morning
08:33:45    2015-05-22  morning

【问题讨论】:

标签: python datetime pandas dataframe


【解决方案1】:

这很正常,你要求的东西既高于 23 又低于 7。你需要使用模数,公式为 (current - begin) % 24 &lt;= (end - begin) % 24

您将面临的另一个问题是您在 periods 的每次迭代中重新分配 df['periods'];您所做的每一项更改都会被下一次迭代覆盖。创建列并使用loc 方法分配句点要简单得多。

df['periods'] = 'unknown_period'
for k, v in periods.items():
    begin = v[0].hour
    end = v[1].hour
    df.loc[(df.Time.apply(lambda x: x.hour) - begin) % 24 <= (end - begin) % 24, 'periods'] = k

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-08
    • 2019-04-15
    • 2021-10-10
    • 2023-03-29
    • 2017-08-07
    • 1970-01-01
    • 1970-01-01
    • 2019-11-02
    相关资源
    最近更新 更多