我是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