熊猫:将时间间隔整数转换为时间

时间:2015-09-09 16:14:54

标签: python pandas python-datetime

我想将5分钟间隔(也就是整数)转换为时间格式。

例如,下面,0区间应该变为00:00,5区间应该变为00:05等。

date        interval
2012-10-01  0
2012-10-01  5
2012-10-01  10
2012-10-01  15
2012-10-01  20
2012-10-01  25
2012-10-01  30
2012-10-01  35
2012-10-01  40

我认为以下内容可行:

df['interval'] = pd.to_datetime(df['interval'], format='%H:%M').dt.hour

但它会返回此错误:

time data 0 does not match format '%H:%M' (match)

这是合乎逻辑的,但是我不清楚如何格式化to.datetime格式参数。我无法在pandas documentation中看到任何有帮助的内容。

更新

很遗憾,我无法使用我的实际DataFrame。我应该添加interval变量从0到2355一遍又一遍地运行的进一步信息。该变量具有0到2355个值的17,568行。

@padraig,你的答案我得到了这个错误:

ValueError: hour must be in 0..23

3 个答案:

答案 0 :(得分:2)

from datetime import time
import pandas as pd
def to_time(x):
    hours, mn = divmod(x,60)
    return  time(hours,mn)

df["interval"] = df["interval"].apply(to_time)

输出:

         date  interval
0  2012-10-01  00:00:00
1  2012-10-01  00:05:00
2  2012-10-01  00:10:00
3  2012-10-01  00:15:00
4  2012-10-01  00:20:00
5  2012-10-01  00:25:00
6  2012-10-01  00:30:00
7  2012-10-01  00:35:00
8  2012-10-01  00:40:00

或者使用read_csv并只增加小时数:

from datetime import time
import pandas as pd
def to_time(x):
    hours, mn = divmod(int(x), 60)
    return "{:02}:{:02}".format(hours, mn)
df = pd.read_csv("test.csv", date_parser=to_time, parse_dates=["interval"])
print(df)

如果我们更改最后一个"间隔"到2355输出:

         date interval
0  2012-10-01    00:00
1  2012-10-01    00:05
2  2012-10-01    00:10
3  2012-10-01    00:15
4  2012-10-01    00:20
5  2012-10-01    00:25
6  2012-10-01    00:30
7  2012-10-01    00:35
8  2012-10-01    39:15

答案 1 :(得分:2)

只需将其格式化为字符串。

方法1(使用旧样式):

"%02d:%02d" % (int(interval / 60), interval % 60)

方法2(使用较新的样式):

"{:02d}:{:02d}".format(int(interval / 60), interval % 60)

答案 2 :(得分:1)

虽然您要求时间,但您最好使用记录日期和时间的Pandas时间戳。

根据您的间隔,您可以将其转换为小时和分钟:

df['hour'] = df.interval // 100 
df['mins'] = df.interval.apply(lambda interval: interval % 100)

您现在可以创建时间戳,可选择使用时区(例如UTC):

from pytz import UTC

df['timestamp'] = df.apply(lambda row: pd.Timestamp('{0} {1}:{2}'.format(row.date, row.hour, row.mins), tz=UTC), axis=1)

>>> df
         date  interval  hour  mins           timestamp
0  2012-10-01         0     0     0 2012-10-01 00:00:00
1  2012-10-01         5     0     5 2012-10-01 00:05:00
2  2012-10-01        10     0    10 2012-10-01 00:10:00
3  2012-10-01        15     0    15 2012-10-01 00:15:00
4  2012-10-01        20     0    20 2012-10-01 00:20:00
5  2012-10-01        25     0    25 2012-10-01 00:25:00
6  2012-10-01        30     0    30 2012-10-01 00:30:00
7  2012-10-01        35     0    35 2012-10-01 00:35:00
8  2012-10-01        40     0    40 2012-10-01 00:40:00

根据时间戳,您可以访问其他properties,如下所示:

>>> df.timestamp[5].time()
datetime.time(0, 25)

如果您真的希望将时间作为单独的列(格式化为文本,但可选择任何其他所需的时间格式):

df['time'] = df.timestamp.apply(lambda time: time.strftime('%H:%M'))

>>> df
         date  interval  hour  mins                  timestamp   time
0  2012-10-01         0     0     0  2012-10-01 00:00:00+00:00  00:00
1  2012-10-01         5     0     5  2012-10-01 00:05:00+00:00  00:05
2  2012-10-01        10     0    10  2012-10-01 00:10:00+00:00  00:10
3  2012-10-01        15     0    15  2012-10-01 00:15:00+00:00  00:15
4  2012-10-01        20     0    20  2012-10-01 00:20:00+00:00  00:20
5  2012-10-01        25     0    25  2012-10-01 00:25:00+00:00  00:25
6  2012-10-01        30     0    30  2012-10-01 00:30:00+00:00  00:30
7  2012-10-01        35     0    35  2012-10-01 00:35:00+00:00  00:35
8  2012-10-01        40     0    40  2012-10-01 00:40:00+00:00  00:40