我正在使用pandas将excel文件读入python。
xls = pd.ExcelFile(“filename.xlsx”)
df = xls.parse('Sheet1')
我的数据框中有一列(time_since_illness_onset),其格式为datetime对象:
1900-01-03 00:00:00 1900-01-04 04:30:00
我想解析这些,以便我有一个天,小时和秒的列(这里的年份和月份毫无意义)。
我使用了以下代码:
df['time_since_illness_onset'] = pd.to_datetime(df['time_since_illness_onset'], errors='coerce')
df['time_since_illness_onset'] = df['time_since_illness_onset'].dt.day + df['time_since_illness_onset'].dt.hour/24. + df['time_since_illness_onset'].dt.minute/60./24
似乎工作正常。但是,我注意到,对于不到一天的日期时间,上述代码将日期转换为NaT。
举个例子,我在原始数据框中有一行,如下所示: 22:00:00 在我用上面两行操纵数据帧后,它变成了NaT。任何帮助将不胜感激,谢谢!
答案 0 :(得分:0)
您可以指定已解析日期时间的格式,然后使用combine_first
替换NaT
,而不使用指定格式解析默认日期时间:
print (df)
time_since_illness_onset
0 1900-01-03 00:00:00
1 1900-01-04 04:30:00
2 22:00:00
a = pd.to_datetime(df['time_since_illness_onset'], errors='coerce')
b = pd.to_datetime(df['time_since_illness_onset'], format='%H:%M:%S', errors='coerce')
c = b.combine_first(a)
print (a)
0 1900-01-03 00:00:00
1 1900-01-04 04:30:00
2 2018-01-26 22:00:00
Name: time_since_illness_onset, dtype: datetime64[ns]
print (b)
0 NaT
1 NaT
2 1900-01-01 22:00:00
Name: time_since_illness_onset, dtype: datetime64[ns]
print (c)
0 1900-01-03 00:00:00
1 1900-01-04 04:30:00
2 1900-01-01 22:00:00
Name: time_since_illness_onset, dtype: datetime64[ns]
s = c.dt.day + c.dt.hour/24. + c.dt.minute/60./24
#if format HH:MM:SS one default day is necessary substract
df['time_since_illness_onset_new'] = s.where(b.isnull(), s - 1)
print (df)
time_since_illness_onset time_since_illness_onset_new
0 1900-01-03 00:00:00 3.000000
1 1900-01-04 04:30:00 4.187500
2 22:00:00 0.916667