<p>虽然不太漂亮,但它确实很管用。如果能看看这个问题是否有更优雅的解决方案,那就太好了</p>
<pre><code>import pandas as pd
# create df
df = pd.DataFrame({'PlugInTime': ['2019-01-02 05:53:00', '2019-01-02 07:53:00'], 'PlugOutTime': ['2019-01-02 14:38:00', '2019-01-02 16:38:00'], 'DeliveredEnergy': [36.0, 8.0], 'ChargeDuration': ['05:57:00', '03:12:00'] })
# set dtypes
df['PlugInTime'] = pd.to_datetime(df.PlugInTime)
df['PlugOutTime'] = pd.to_datetime(df.PlugOutTime)
df['ChargeDuration'] = pd.to_timedelta(df.ChargeDuration)
# determine charge time in hours
df['hours'] = df.ChargeDuration.dt.seconds / 3600
# split the hours into a list
df['split'] = df.ChargeDuration.apply(lambda x: [1 for _ in range(int(x.total_seconds() // 3600))] + [(x.total_seconds() % 3600 / 3600 or None)])
# explode the list
df = df.explode('split')
# calculate the energy per hour
df['DeliveredEnergy'] = df.DeliveredEnergy / df.hours * df.split
# update PlugInTime
df['PlugInTime'] = df.PlugInTime + pd.to_timedelta(df.PlugInTime.groupby(level=0).cumcount(), unit='h')
print(df)
PlugInTime PlugOutTime DeliveredEnergy ChargeDuration hours split
0 2019-01-02 05:53:00 2019-01-02 14:38:00 6.05042 05:57:00 5.95 1
0 2019-01-02 06:53:00 2019-01-02 14:38:00 6.05042 05:57:00 5.95 1
0 2019-01-02 07:53:00 2019-01-02 14:38:00 6.05042 05:57:00 5.95 1
0 2019-01-02 08:53:00 2019-01-02 14:38:00 6.05042 05:57:00 5.95 1
0 2019-01-02 09:53:00 2019-01-02 14:38:00 6.05042 05:57:00 5.95 1
0 2019-01-02 10:53:00 2019-01-02 14:38:00 5.7479 05:57:00 5.95 0.95
1 2019-01-02 07:53:00 2019-01-02 16:38:00 2.5 03:12:00 3.20 1
1 2019-01-02 08:53:00 2019-01-02 16:38:00 2.5 03:12:00 3.20 1
1 2019-01-02 09:53:00 2019-01-02 16:38:00 2.5 03:12:00 3.20 1
1 2019-01-02 10:53:00 2019-01-02 16:38:00 0.5 03:12:00 3.20 0.2
</code></pre>