将python字符串索引转换为datetime索引

将python字符串索引转换为datetime索引,python,pandas,datetime,Python,Pandas,Datetime,我正在导入一些数据,其中一列表示日期,另一列表示小时。我想把它们合并成一个DateTime列 我用过 df2 = pd.read_csv(csv_file_path, parse_dates=[['Date', 'Hour']], infer_datetime_format=True) 它回来了 Date_Hour Unnamed: 0 Data 0 2018-01-01 0 3

我正在导入一些数据,其中一列表示日期,另一列表示小时。我想把它们合并成一个DateTime列

我用过

df2 = pd.read_csv(csv_file_path,
              parse_dates=[['Date', 'Hour']],
              infer_datetime_format=True)
它回来了

      Date_Hour    Unnamed: 0      Data
0   2018-01-01 0         3         51.29
1   2018-01-01 1         4         43.59    
2   2018-01-01 2         5         93.60    
3   2018-01-01 3         6         54.78    
4   2018-01-01 4         7         14.35
但是列Date_Hour不是DateTime格式,当我尝试转换它时,我得到一个错误

df2.set_index('Date_Hour', inplace=True)
pd.to_datetime(df2.index)
给予

我也尝试过使用

pd.to_datetime(prices.index, format='%y-%m-%d %H')
我导入的数据如下所示

 ,Date,Hour,Data
3,2018-01-01,0,51.29
4,2018-01-01,1,43.59
5,2018-01-01,2,93.60
6,2018-01-01,3,54.78
7,2018-01-01,4,14.35
8,2018-01-01,5,18.60
我希望输出是

                          Data
 Date_Hour
2018-01-01 00:00         51.29
2018-01-01 01:00         43.59  
2018-01-01 02:00         93.60  
2018-01-01 03:00         54.78  
2018-01-01 04:00         14.35

在这种特定情况下,小时中缺少的前导
0
是有问题的。您可以避免这种导入,而无需解析到
datetime
,然后在解析到
datetime
之前使用
zfill

df2 = pd.read_csv(csv_file_path)
df2.index = pd.to_datetime(df2.Date + df2.Hour.astype(str).str.zfill(2), format='%Y-%m-%d%H')
要在解析后删除
日期
小时
列,请执行以下操作:

df2.drop(['Date' ,'Hour'], axis=1, inplace=True)
简短说明:
zfill
将在数字字符串中填充指定字符数的零


当然,您也可以为
pd.read\u csv
指定一个
date\u解析器,但是在这种情况下,在阅读csv之后解析日期要清晰得多,而且更像python。

编辑:一些答案大大改进了我的第一次破解。我将不讨论这个问题,因为它在另一个答案中被引用

让我们先将日期设置为datetime类型

df["Date"] = pd.to_datetime(df["Date"], unit="ms")
我们希望增加小时数,因此它们必须是
Timedelta

df["Hour"] = df["Hour"].apply(lambda x: pd.Timedelta(hours=int(x)))
下面是一个简单的总数:

df["Date_hour"] = df["Date"] + df["Hour"]
设置datetime索引的方法与设置datetime数据类型的任何其他列的方法相同:

df = df.set_index("Date_hour")
很接近。只是一些变化

df

      sr          Date  Hour     Data
0      3    2018-01-01     0    51.29
1      4    2018-01-01     1    43.59
2      5    2018-01-01     2    93.60
3      6    2018-01-01     3    54.78
4      7    2018-01-01     4    14.35
5      8    2018-01-01     5    18.60


df["Date"] = pd.to_datetime(df["Date"], unit="ns")
df["Hour"] = pd.to_timedelta(df["Hour"])
df["Date_Hour"]=(df["Date"] + df["Hour"]).dt.strftime('%Y-%m-%d %H:%M')
df.set_index("Date_Hour")

                    sr        Date  Hour     Data
       Date_Hour                
2018-01-01 00:00     3  2018-01-01     0    51.29
2018-01-01 01:00     4  2018-01-01     1    43.59
2018-01-01 02:00     5  2018-01-01     2    93.60
2018-01-01 03:00     6  2018-01-01     3    54.78
2018-01-01 04:00     7  2018-01-01     4    14.35
2018-01-01 05:00     8  2018-01-01     5    18.60

你想要的o/p是什么?我会更新这个问题,但要有一个日期时间格式的索引,
Date\u Hour
的预期格式是什么?不,索引有不同的用途。@LukaVlaskalic我的回答解决了你的问题吗?我怀疑这比转换到Timedelta(我在回答中走的路线)要快是的,确实是这样。:)特别是使用
apply对所有值进行循环将减慢解析速度。
df[“Hour”]=df[“Hour”].apply(lambda x:pd.Timedelta(hours=int(x))
可以使用
df[“Hour”]=pd.to_Timedelta(df[“Hour”],unit='h')简化
这仍然比直接解析到datetime要慢,需要3行代码而不是一行。:)是的,这仍然是一个很好的答案,可能对其他情况有所帮助,因此我投了赞成票。
df

      sr          Date  Hour     Data
0      3    2018-01-01     0    51.29
1      4    2018-01-01     1    43.59
2      5    2018-01-01     2    93.60
3      6    2018-01-01     3    54.78
4      7    2018-01-01     4    14.35
5      8    2018-01-01     5    18.60


df["Date"] = pd.to_datetime(df["Date"], unit="ns")
df["Hour"] = pd.to_timedelta(df["Hour"])
df["Date_Hour"]=(df["Date"] + df["Hour"]).dt.strftime('%Y-%m-%d %H:%M')
df.set_index("Date_Hour")

                    sr        Date  Hour     Data
       Date_Hour                
2018-01-01 00:00     3  2018-01-01     0    51.29
2018-01-01 01:00     4  2018-01-01     1    43.59
2018-01-01 02:00     5  2018-01-01     2    93.60
2018-01-01 03:00     6  2018-01-01     3    54.78
2018-01-01 04:00     7  2018-01-01     4    14.35
2018-01-01 05:00     8  2018-01-01     5    18.60