熊猫:如何处理奇怪的时间格式

我有以下 Pandas 数据框,其中时间(持续时间)以一种非常奇怪的格式给出:


Person   Activity   Duration

1        A          1 00:00

2        A          1 00:00

3        B          0 21:17

4        C          0 17:11

其中1 00:00表示 24 小时,0 21:17表示 0 天和 21:17 小时,也就是说只有 21:17 小时。快速查看 dtypes 返回:


In[1]: df.dtypes

Out[1]: 

Person         object

Activity       object

Duration       object

dtype: object

如果值为 ,我如何始终如一地对待该Duration列以返回 24 1 00:00,如果我有,则返回持续时间的十进制值0 21:17?的十进制值为0 21:1721.283。


结果应该是:


Person   Activity   Duration

1        A          24

2        A          24

3        B          21.283

4        C          17.183


哔哔one
浏览 128回答 5
5回答

慕少森

a = np.array([24, 1, 1/60])    df.Duration = df.Duration.str.split(' |:', expand=True).astype(int).dot(a)例子:df = pd.DataFrame({'Person': [1,2,3,4], "Activity": list('AABC') ,"Duration":['1 00:00', '1 00:00', '0 21:17', '0 17:11']})df.Duration = df.Duration.str.split(' |:', expand=True).astype(int).dot(a)print(df)#   Person Activity   Duration#0       1        A  24.000000#1       2        A  24.000000#2       3        B  21.283333#3       4        C  17.183333

森栏

正如您提到的,它不会超过 1 00:00,即 24:00,有一种更简单的方法:'''Person  Activity    Duration1   A   1 00:002   A   1 00:003   B   0 21:174   C   0 17:11'''import pandas as pddf = pd.read_clipboard("\t").   Person Activity Duration0       1        A  1 00:001       2        A  1 00:002       3        B  0 21:173       4        C  0 17:11   .df['Duration'] = df['Duration'].str.split(' ')df['Duration'] = ['24:00' if int(val[0]) == 1 else val[1] for val in df['Duration']]print(df).   Person Activity Duration0       1        A    24:001       2        A    24:002       3        B    21:173       4        C    17:11

繁花不似锦

您可以轻松地将这些数字相乘和相加:durations = [       "1 00:00",    "0 21:17",          ]                                                                        for duration in durations:     day, clock = duration.split()    hour, minute = clock.split(':')    print((int(day) * 24) + int(hour) + (int(minute) / 60))

青春有我

您可以使用 datetime 模块进行时间转换from datetime import datetimedef durationInDecimal(string):    day, time = string.split(" ")    t = datetime.strptime(time, "%H:%M").time()    return int(day)*24 + (t.hour+t.minute/60.0)df = pd.DataFrame({'Person': list("ABCD"), "Activity": list('ABCD') ,"duration":['1 00:00', '1 00:00', '0 21:17', '0 17:11']})df["duration"] = df.duration.apply(durationInDecimal)# Person    Activity    duration# 0 A   A   24.000000# 1 B   B   24.000000# 2 C   C   21.283333# 3 D   D   17.183333

明月笑刀无情

除了其他有用的答案之外,我还想发布我自己的解决方案,它使用自定义函数并将其应用于数据框df.apply:def custom_time_to_decimals(value):&nbsp; &nbsp; if value.split()[0]=='1':&nbsp; &nbsp; &nbsp; &nbsp; return 24&nbsp; &nbsp; else:&nbsp; &nbsp; &nbsp; &nbsp; custom = value.split()[1]&nbsp; &nbsp; &nbsp; &nbsp; hours = int(custom[0:2])&nbsp; &nbsp; &nbsp; &nbsp; minutes = int(custom[3:5])&nbsp; &nbsp; &nbsp; &nbsp; decimal = hours + (minutes/60)&nbsp; &nbsp; &nbsp; &nbsp; return round(decimal,3)df['decimalHours'] = df['<insertYourTimeColumnHere>'].apply(custom_time_to_decimals)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python