将python字符串索引转换为日期时间

时间:2019-01-28 17:40:35

标签: 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         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)

给予

ValueError: ('Unknown string format:', '2018-01-01 0')

我也尝试使用

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

3 个答案:

答案 0 :(得分:1)

在这种特定情况下,小时丢失的前0个问题。您可以在不解析为datetime的情况下避免导入,然后在解析为zfill之前使用datetime

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')

要在解析后将DateHour列删除:

df2.drop(['Date' ,'Hour'], axis=1, inplace=True)

简短说明:
zfill将使用指定的字符数零填充数字字符串。

当然,您也可以为date_parser指定一个pd.read_csv,但是在这种情况下,读取csv后解析日期更加清晰明了,而且更加Python化。

答案 1 :(得分:1)

编辑:一些答案非常改进了我的第一个解决方案。我将不再赘述,因为它在另一个答案中被引用。

让我们开始将日期设置为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 dtype的任何其他列相同的方式设置日期时间索引:

df = df.set_index("Date_hour")

答案 2 :(得分:1)

Charles Landau已经关闭。只是一些改变

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