Pandas datetime格式可以防止NaT

时间:2018-01-26 06:39:50

标签: pandas datetime datetime-format

我正在使用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。任何帮助将不胜感激,谢谢!

1 个答案:

答案 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