转换时间范围为01:00到24:00的熊猫专栏

时间:2020-03-30 03:13:59

标签: python pandas datetime

我将整年的每小时数据存储在对象dtype的Pandas列中。数据是从具有以下结构的.CSV文件中导入的:

Date/Time,kWh
 01/01  01:00:00,1.14168620105289
 01/01  02:00:00,0.998495769210657
 01/01  03:00:00,0.949679309420898
 01/01  04:00:00,0.938080118507197
 01/29  20:00:00,1.14161727165962
 01/29  21:00:00,1.01263083086978
 01/29  22:00:00,0.961652730472469
 01/29  23:00:00,0.951211299856564
 01/29  24:00:00,0.949390070561629

因此,“日期/时间”列包括月,日,小时,分钟和秒。我正在尝试(1)将该列转换为DateTime,并(2)将年份设置为2019。

我遇到了转换问题,因为出于某些奇怪的原因,而不是正常的24小时范围00:00至23:59,对.CSV文件进行编码的小组选择的时间范围为01: 00至24:00。因此,当我运行以下命令时:

cons['Date/Time'] =  pandas.to_datetime(cons['Date/Time'], format=' %m/%d  %H:%M:%S')

我收到以下错误:

ValueError: time data ' 01/01  24:00:00' does not match format ' %m/%d  %H:%M:%S' (match)

我正在寻求将列转换为DateTime并将数据的年份设置为2019的帮助。希望能提供任何帮助。

1 个答案:

答案 0 :(得分:0)

简短的回答:我做了一些字符串操作以将所有时间减少一小时

df['temp_col'] = df['Date/Time,kWh'].str.split(':').str[0]
df['temp_col'] = (pd.to_numeric(df['temp_col']) - 1).astype(str)
df['temp_col'] = df['temp_col'].apply(lambda x: f'0{x}' if len(x)==1 else x)
df['temp_col'] = df['temp_col'] + df['Date/Time,kWh'].str[2:]

下面的输出并不干净,因为您发布的数据不能很好地通过pd.read_clipboard()复制,但是应该可以给您一个思路。

        Date/Time,kWh               temp_col
01/01   01:00:00,1.14168620105289   00:00:00,1.14168620105289
01/01   02:00:00,0.998495769210657  01:00:00,0.998495769210657
01/01   03:00:00,0.949679309420898  02:00:00,0.949679309420898

更多详细信息::我将字符串的第一部分记为小时,并创建了一个将其转换为整数并减去1的列。然后,将字符串的其余部分添加到其中。根据您的问题,这将是将小时数设置为0-23(而不是1-24)的一种方法。听起来一切都比“应该晚了一个小时?”。否则,如果您只是想使24:00 = 00:00(不确定哪种方法对您的数据正确),则@dzakyputra对此发表了评论。您还可以进行类似的字符串操作以使24:00到00:000,因此希望这可以帮助您解决。

如果您想使其成为一种“单线”,则最好将其分解为多个步骤。

df['Date/Time,kWh'] = (pd.to_numeric(df['Date/Time,kWh'].str.split(':').str[0])-1).astype(str).apply(lambda x: f'0{x}' if len(x)==1 else x) + df['Date/Time,kWh'].str[2:]

输出:

        Date/Time,kWh
01/01   00:00:00,1.14168620105289
01/01   01:00:00,0.998495769210657
01/01   02:00:00,0.949679309420898