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

Python 熊猫:将时间间隔整数转换为时间,python,pandas,python-datetime,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_date

我想把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_datetimedf['interval'],格式='%H:%M'。dt.hour

但它返回以下错误:

时间数据0与格式“%H:%M”不匹配

这是合乎逻辑的,但让我不清楚如何格式化to.datetime格式参数。我看不到任何有帮助的东西

更新

不幸的是,我无法让这些与我的实际数据帧一起工作。我应该添加间隔变量从0到2355反复运行的更多信息。该变量有17568行0到2355的值

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

ValueError:小时必须在0..23中

输出:

         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: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输出:


只需将其格式化为字符串

方法1使用旧样式:

"%02d:%02d" % (int(interval / 60), interval % 60)
方法2使用较新的样式:

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

只需将其格式化为字符串

方法1使用旧样式:

"%02d:%02d" % (int(interval / 60), interval % 60)
方法2使用较新的样式:

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

虽然你问了时间,但你最好有一个记录日期和时间的时间戳

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

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
给定时间戳,您可以按如下方式访问其他时间,例如时间:

>>> 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

虽然你问了时间,但你最好有一个记录日期和时间的时间戳

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

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
给定时间戳,您可以按如下方式访问其他时间,例如时间:

>>> 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

@padraig这些都很好,但与我的实际数据不符,这是我的错。我已经更新了问题,以澄清问题。@Jonathan,啊,好吧,你只想增加小时和分钟,还是我们会考虑天数等?尝试编辑,看看我们是否在同一页上,如果不是,我们将需要使用datetime@padraig这些都很好,但与我的实际数据不符,这是我的错。我已经更新了问题,以澄清问题。@Jonathan,啊,好吧,你只想增加小时和分钟,还是我们会考虑天数等?尝试编辑,看看我们是否在同一页上,如果不是,我们将需要使用DateTime。从您的示例中不清楚您的间隔是HHMM格式。我已经修改了我的解决方案,以便它能够处理您的数据。从您的示例中不清楚您的间隔是HHMM格式。我已经修改了我的解决方案,以便它能够处理您的数据。Alexander和其他所有人:最后,这个答案对我的数据最有效,并且有助于提供额外的时间度量。Alexander和其他所有人:最后,这个答案对我的数据最有效,并且有助于提供额外的时间度量。