Python-搜索包含日期时间字符串的单元格的电子表格



我是Python新手,这是我的第一篇SO文章。我正在尝试使用python从电子表格中的单元格中提取日期戳。我尝试了以下方法:

df = pd.read_excel(fileName, sheet_name=0)
df_columns = dict(zip(df.columns,range(len(df.columns))))
df_start = df.rename(columns=df_columns)
for i in range(0, len(df.columns)):
for j in range(0, 4):
if isinstance(df.iloc[i,j],str) and ':' in df.loc[i,j]:
datestamp = datetime.datetime.strptime(df.iloc[i,j], '%d/%m/%Y %H:%M:%S')
break

我收到一条错误消息";0处出现错误;。

数据帧看起来像这样:

|0|1|2|…|10 | 11 | 12 |

|----|----|---|…|----|------------------|---|

|NaN|NaN|NaN|…|NaN | 2022-09-16 16:47:21.852 | NaN |

|NaN|NaN|NaN|…|NaN | 2022-09-16 16:47:21.852 | NaN |

|NaN|NaN|NaN|…|NaN|NaN|NaN|

|NaN|NaN|NaN|…|NaN|NaN|NaN|

|NaN|ClientName|客户端编号||核心|核心描述|状态|

|NaN|AB09403880|9403880||NaN|NaN|活动|

|NaN|AB09403881|9403881||NaN|NaN|活动|

|NaN|AB09403882|9403883||NaN|NaN|活动|


EDIT:我想提取这个电子表格中的日期戳,作为列添加到不同的数据帧中,最终将写入CSV文件。我还应该补充一点,日期戳所在的列不一定会在电子表格的第11列(第1行和第2行(,因此我尝试在单元格中循环。希望这是有道理的。


编辑2:更新了数据帧的附加行

预期输出:

|日期戳|客户端名称|客户端编号||核心|核心描述|状态|

|2022-09-16|AB09403880|9403880||NaN|NaN|活动|

|2022-09-16|AB09403881|9403881||NaN|NaN|活动|

|2022-09-16|AB09403882|9403883||NaN|NaN|活动|

考虑到Excel文件只有分布在多行/列中的时间戳值(请参阅下面的示例/dataframe(:

import pandas as pd
df = pd.read_excel("myinnernerd.xlsx")
print(df)
0    1    2    3                        4                        5    6    7    8    9                        10                       11                       12
0                       NaN  NaN  NaN  NaN                      NaN                      NaN  NaN  NaN  NaN  NaN                      NaN  2022-09-16 16:47:21.852                      NaN
1                       NaN  NaN  NaN  NaN                      NaN                      NaN  NaN  NaN  NaN  NaN                      NaN  2022-09-16 16:47:21.852                      NaN
2                       NaN  NaN  NaN  NaN                      NaN  2022-09-16 16:47:21.852  NaN  NaN  NaN  NaN                      NaN                      NaN                      NaN
3                       NaN  NaN  NaN  NaN                      NaN                      NaN  NaN  NaN  NaN  NaN                      NaN                      NaN                      NaN
4   2022-09-16 16:47:21.852  NaN  NaN  NaN                      NaN                      NaN  NaN  NaN  NaN  NaN  2022-09-16 16:47:21.852                      NaN                      NaN
5                       NaN  NaN  NaN  NaN                      NaN                      NaN  NaN  NaN  NaN  NaN                      NaN                      NaN                      NaN
6                       NaN  NaN  NaN  NaN                      NaN                      NaN  NaN  NaN  NaN  NaN                      NaN                      NaN                      NaN
7                       NaN  NaN  NaN  NaN  2022-09-16 16:47:21.852  2022-09-16 16:47:21.852  NaN  NaN  NaN  NaN                      NaN                      NaN                      NaN
8                       NaN  NaN  NaN  NaN  2022-09-16 16:47:21.852                      NaN  NaN  NaN  NaN  NaN                      NaN                      NaN                      NaN
9                       NaN  NaN  NaN  NaN                      NaN                      NaN  NaN  NaN  NaN  NaN                      NaN                      NaN                      NaN
10                      NaN  NaN  NaN  NaN                      NaN                      NaN  NaN  NaN  NaN  NaN                      NaN                      NaN  2022-09-16 16:47:21.852

您可以使用pandas.DataFrame.stack与所有列相交,然后使用pandas.DataFrame.explode分解最终具有多个时间戳的行:

f = lambda x: list(x) if len(x) > 1 else x
df['datestamp'] = df.stack().groupby(level=0).agg(f)
df = df.pop('datestamp').dropna().explode().to_frame()

之后,使用pandas.to_datetime将列datestamp转换为日期时间对象,然后按秒'S'将其下限。

df['datestamp'] = pd.to_datetime(df['datestamp']).dt.floor('S')
print(df)
datestamp
0  2022-09-16 16:47:21
1  2022-09-16 16:47:21
2  2022-09-16 16:47:21
4  2022-09-16 16:47:21
4  2022-09-16 16:47:21
7  2022-09-16 16:47:21
7  2022-09-16 16:47:21
8  2022-09-16 16:47:21
10 2022-09-16 16:47:21
print(df.dtypes)
datestamp    datetime64[ns]
dtype: object

这对我有效,但只是因为excel文件中没有其他日期戳:

def rep_date(df):
x = df.select_dtypes(include=[np.datetime64])
y = x.iloc[1].dt.strftime('%Y-%m-%d %H:%M:%S.%f').to_string(index=False)
return y

最新更新