Pandas: 将时间间隔整数转换为时间
Pandas: Convert time interval integers to times
我想将 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
但是returns这个错误:
time data 0 does not match format '%H:%M' (match)
这是合乎逻辑的,但让我不清楚如何格式化 to.datetime
格式参数。我在 pandas documentation 中看不到任何有帮助的内容。
更新
不幸的是,我无法让这些中的任何一个与我的实际 DataFrame 一起使用。我应该添加更多信息,即 interval
变量一遍又一遍地从 0 运行到 2355。该变量有 17,568 行 0 到 2355 的值。
@padraig,你的两个答案我都得到了这个错误:
ValueError: hour must be in 0..23
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)
如果我们将最后一个 "interval" 更改为 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
只需将其格式化为字符串即可。
方法一(使用旧式):
"%02d:%02d" % (int(interval / 60), interval % 60)
方法二(使用较新的样式):
"{:02d}:{:02d}".format(int(interval / 60), interval % 60)
尽管您询问了时间,但最好使用记录日期和时间的 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
我想将 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
但是returns这个错误:
time data 0 does not match format '%H:%M' (match)
这是合乎逻辑的,但让我不清楚如何格式化 to.datetime
格式参数。我在 pandas documentation 中看不到任何有帮助的内容。
更新
不幸的是,我无法让这些中的任何一个与我的实际 DataFrame 一起使用。我应该添加更多信息,即 interval
变量一遍又一遍地从 0 运行到 2355。该变量有 17,568 行 0 到 2355 的值。
@padraig,你的两个答案我都得到了这个错误:
ValueError: hour must be in 0..23
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)
如果我们将最后一个 "interval" 更改为 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
只需将其格式化为字符串即可。
方法一(使用旧式):
"%02d:%02d" % (int(interval / 60), interval % 60)
方法二(使用较新的样式):
"{:02d}:{:02d}".format(int(interval / 60), interval % 60)
尽管您询问了时间,但最好使用记录日期和时间的 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