我正在导入一些数据,其中一列显示日期,另一列显示小时。我想将它们合并为一个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
答案 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')
要在解析后将Date
和Hour
列删除:
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