将“对象”列转换为日期时间

时间:2021-03-02 16:12:15

标签: python pandas datetime

我目前有以下数据框(7 天,下面显示 1 天)。营业时间为 01:00 至 24:00。如何将 HourEnding 列转换为 datetime 格式并将其与 date_time 列(已采用日期时间格式)合并?

    HourEnding  LMP date_time
0   01:00   165.27  2021-02-20
1   02:00   155.89  2021-02-20
2   03:00   154.50  2021-02-20
3   04:00   153.44  2021-02-20
4   05:00   210.15  2021-02-20
5   06:00   298.90  2021-02-20
6   07:00   152.71  2021-02-20
7   08:00   204.61  2021-02-20
8   09:00   155.77  2021-02-20
9   10:00   90.64   2021-02-20
10  11:00   57.17   2021-02-20
11  12:00   43.74   2021-02-20
12  13:00   33.42   2021-02-20
13  14:00   5.05    2021-02-20
14  15:00   1.43    2021-02-20
15  16:00   0.99    2021-02-20
16  17:00   0.94    2021-02-20
17  18:00   12.13   2021-02-20
18  19:00   18.90   2021-02-20
19  20:00   19.04   2021-02-20
20  21:00   16.42   2021-02-20
21  22:00   14.47   2021-02-20
22  23:00   44.55   2021-02-20
23  24:00   40.51   2021-02-20

到目前为止我已经尝试过

df['time'] = pd.to_datetime(df['HourEnding'])

但由于 24:00,这似乎失败了。 同理

df['time'] = pd.to_timedelta('HourEnding', 'h', errors = 'coerce')

产生一列 NaT。

2 个答案:

答案 0 :(得分:2)

正如您在评论中提到的,24 小时对应于同一天的午夜。我只是先用“00”替换“24”:

df['HourEnding'] = df.HourEnding.str.replace('24:00', '00:00')

然后,将 date_time 转换为字符串:

df['date_time'] = df.date_time.astype(str)

创建一个连接 date_timeHourEnding 的新列:

df['date_and_hour'] = df.date_time + " " + df.HourEnding
df['date_and_hour'] = pd.to_datetime(df.date_and_hour)

这给了你这个:

>>> df
   HourEnding     LMP   date_time       date_and_hour
0       01:00  165.27  2021-02-20 2021-02-20 01:00:00
1       02:00  155.89  2021-02-20 2021-02-20 02:00:00
2       03:00  154.50  2021-02-20 2021-02-20 03:00:00
3       04:00  153.44  2021-02-20 2021-02-20 04:00:00
4       05:00  210.15  2021-02-20 2021-02-20 05:00:00
5       06:00  298.90  2021-02-20 2021-02-20 06:00:00
6       07:00  152.71  2021-02-20 2021-02-20 07:00:00
7       08:00  204.61  2021-02-20 2021-02-20 08:00:00
8       09:00  155.77  2021-02-20 2021-02-20 09:00:00
9       10:00   90.64  2021-02-20 2021-02-20 10:00:00
10      11:00   57.17  2021-02-20 2021-02-20 11:00:00
11      12:00   43.74  2021-02-20 2021-02-20 12:00:00
12      13:00   33.42  2021-02-20 2021-02-20 13:00:00
13      14:00    5.05  2021-02-20 2021-02-20 14:00:00
14      15:00    1.43  2021-02-20 2021-02-20 15:00:00
15      16:00    0.99  2021-02-20 2021-02-20 16:00:00
16      17:00    0.94  2021-02-20 2021-02-20 17:00:00
17      18:00   12.13  2021-02-20 2021-02-20 18:00:00
18      19:00   18.90  2021-02-20 2021-02-20 19:00:00
19      20:00   19.04  2021-02-20 2021-02-20 20:00:00
20      21:00   16.42  2021-02-20 2021-02-20 21:00:00
21      22:00   14.47  2021-02-20 2021-02-20 22:00:00
22      23:00   44.55  2021-02-20 2021-02-20 23:00:00
23      00:00   40.51  2021-02-20 2021-02-20 00:00:00

>>> df.dtypes
HourEnding               object
LMP                     float64
date_time                object
date_and_hour    datetime64[ns]

答案 1 :(得分:1)

将两列都转换为字符串,然后将它们连接到一个新的“datetime”列中,最后将“datetime”列转换为datetime。

编辑:为了处理 1-24 小时的问题,构建一个函数来拆分字符串并从每个小时中减去 1,然后加入:

def subtract_hour(t):
    t = t.split(':')
    t[0] = str(int(t[0]) - 1)
    if len(t[0]) < 2:
        t[0] = '0' + t[0]
    return ':'.join(t)

然后您可以将其应用于小时列(例如,df['hour'] = df['hour'].apply(subtract_hour))并继续连接列,然后使用 pd.to_datetime 进行解析。

编辑 2:您只想将“24”更改为“00”,我不好。

def mod_midnight(t):
    t = t.split(':')
    if t[0] == '24':
        t[0] = '00'
    return ':'.join(t)